gpt4 book ai didi

c# - WPF 如何让 RichTextBox 的宽度跟随父控件的宽度?

转载 作者:太空宇宙 更新时间:2023-11-03 22:53:54 31 4
gpt4 key购买 nike

这里我有以下简单的窗口:

enter image description here

上半部分是DataGrid,下半部分是TextBox。窗口的大小设置为内容的宽度。这是所需的布局。

现在我需要显示一些富文本,所以我用 RichTextBox 替换了 TextBox。问题是现在窗口延伸到屏幕的宽度,就像这样(当然,我已经缩小了它,但你明白了):

enter image description here

我已经尝试将 RichTextBox 的宽度绑定(bind)到父级的实际宽度:

 <RichTextBox Width="{Binding ElementName=Wrapper, Path=ActualWidth}"/>

但它仍然扩展到整个窗口。顺便说一句,如果我在上面的代码中使用 TextBox,也会发生同样的情况。

如何使 RichTextBox 的宽度适合父级,同时仍保持动态窗口布局?我的意思是 DataGrid 是窗口宽度和 RichTextBox 宽度必须受制于的关键元素。

完整代码如下。

XAML

<Window x:Class="RichTextBox_Wrap.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:RichTextBox_Wrap"
mc:Ignorable="d"
SizeToContent="Width"
Title="MainWindow" Height="250" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="30"/>
<RowDefinition/>
</Grid.RowDefinitions>
<DataGrid Grid.Row="0"
HeadersVisibility="Column"
CanUserAddRows="False"
ItemsSource="{Binding Items}">
</DataGrid>
<StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="Info" />
</StackPanel>
<DockPanel x:Name="Wrapper" Grid.Row="2">
<Border BorderBrush="CadetBlue" BorderThickness="1">
<RichTextBox />
</Border>
</DockPanel>
</Grid>
</Window>

C#

public class Item
{
public string Name { get; set; }
public string Description { get; set; }
public double Price { get; set; }
}

public class ViewModel
{
public ObservableCollection<Item> Items { get; set; }

public ViewModel()
{
Items = new ObservableCollection<Item>
{
new Item {Name = "Apple", Description="Fruit", Price=3},
new Item {Name = "Banana", Description="Fruit", Price=5},
new Item {Name = "Tomato", Description="Vegetable", Price=4},
};
}
}

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}

解决方案

1.mm8 的解决方案几乎可行,但似乎 Loaded 事件发生得早,无法正确计算 ActualWidth - RichTextBox 未填充宽度并留下间隙。但更进一步,我使用窗口的“Content_Rendered”事件来固定窗口的宽度,然后将 RichTextBox 的宽度设置为自动。

<RichTextBox x:Name="RichBox" Grid.Row="1" MinHeight="75" Width="0" Visibility="Hidden" />

private void Window_ContentRendered(object sender, EventArgs e)
{
var window = sender as Window;
window.SizeToContent = SizeToContent.Manual;
window.Width = window.ActualWidth;
RichBox.Width = double.NaN;
RichBox.Visibility = Visibility.Visible;
}

2. Spongebrot 恰到好处。实际上,当删除额外边框时,绑定(bind)到父级的 ActualWidth 起作用。但在现实生活中,我的控制更为复杂,边界存在是有原因的。但这可以通过级联绑定(bind)来解决:

<DockPanel x:Name="Wrapper" Grid.Row="2" >
<Border x:Name="MyBorder" BorderBrush="CadetBlue" BorderThickness="1" Width="{Binding ElementName=Wrapper, Path=ActualWidth}" >
<RichTextBox x:Name="RichBox" Width="{Binding ElementName=MyBorder, Path=Width}" />
</Border>
</DockPanel>

如果绑定(bind)到祖 parent 或更远的祖先,似乎绑定(bind)到 ActualWidth 不会按预期工作。这似乎就是 Sinatr 的建议也不起作用的原因。

最佳答案

一个简单的解决方法是在 XAML 标记中将 RichTextBoxWidth 设置为 0,然后处理其 Loaded 事件并将 Width 设置为窗口加载后的宽度:

<RichTextBox Width="0" Loaded="RichTextBox_Loaded" />

private void RichTextBox_Loaded(object sender, RoutedEventArgs e)
{
RichTextBox rtb = sender as RichTextBox;
rtb.Width = this.Width;
}

关于c# - WPF 如何让 RichTextBox 的宽度跟随父控件的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46400173/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com