这里有以下简单窗口:
上部是DataGrid,下面是TextBox。窗口的大小设置为内容的宽度。这是理想的布局。
现在我需要显示一些richtext,所以我用RichTextBox替换TextBox。问题是,现在窗口延伸到屏幕的宽度,就像这样(我当然缩小了它,但你明白了):
我尝试将RichTextBox的宽度绑定到父级的实际宽度:
<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没有填充宽度并留下空隙。但是进一步采用这个想法我使用了窗口&#34; Content_Rendered&#34;用于修复窗口宽度的事件,然后将RichTextBox的宽度设置为auto。
<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就是现货。实际上,当删除额外边框时,绑定到父级的ActualWidth工作。但在现实生活中,我的控制更加复杂,边界是有原因的。但这可以通过级联绑定来解决:
<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>
如果绑定到祖父母或更远的祖先,似乎绑定到ActualWidth并不会按预期工作。这似乎是为什么Sinatr的建议也不起作用。
答案 0 :(得分:2)
一个简单的解决方法是在XAML标记中将Width
的{{1}}设置为RichTextBox
,然后处理其0
事件并设置Loaded
加载后到窗口的宽度:
Width
<RichTextBox Width="0" Loaded="RichTextBox_Loaded" />
答案 1 :(得分:1)
SizeToContent = “宽度”
所以你希望窗口自动调整为DataGrid
宽度?
RichTextBox
似乎很特殊,它将从其父容器请求最大可用空间,随意占用整个组合桌面宽度。一个简单的解决方法是限制它的宽度:
<Grid>
<DataGrid x:Name="dataGrid" />
<DockPanel>
<Border>
<RichTextBox Width="{Binding ActualWidth, ElementName=dataGrid}" />
</Border>
</DockPanel>
</Grid>