我有个问题.我需要在ScrollViewer中托管带有控件的网格,以防止文本框在UI处被截断或折叠为零.另外,当用户更改窗口宽度时,我希望扩展文本框的内容.我将Window的内容设置为以下代码
<DockPanel>
<TreeView DockPanel.Dock="Left" Width="150"/>
<ScrollViewer VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Text="Name"
Margin="5"
VerticalAlignment="Center"/>
<TextBox Grid.Column="1"
Text="Some Name"
Margin="5"
VerticalAlignment="Center"
MinWidth="200"/>
</Grid>
</ScrollViewer>
</DockPanel>
Run Code Online (Sandbox Code Playgroud)
一切正常,但是当用户在TextBox中键入非常长的文本时,它将被展开并显示水平滚动.是否有任何简单的方法来限制TextBox的最大宽度,并允许仅在用户更改窗口大小时才展开它.
首先,我想说下面的示例过于简单化了.假设你绑定了WPF控件.
<Window Title="Window1" Height="300" Width="300">
<Grid>
<StackPanel>
<TextBox Text="{Binding Name}" Margin="10"/>
<Button HorizontalAlignment="Center"
Content="Click Me" Margin="5"
Padding="2" Click="OnButtonClick" />
</StackPanel>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
Window绑定到Person类,该类实现INotifyPropertyChanged并在表单中具有Name setter
public string Name
{
get { return _name; }
set
{
_name = "Some Name";
OnPropertyChanged("Name");
}
}
Run Code Online (Sandbox Code Playgroud)
即只要用户尝试从UI更改它,就会为其分配"某些名称".但这个样本不起作用.我将TextBox中的名称更改为某个值按Tab键,强制焦点移动到Button,TextBox中的值保持不变,尽管触发了PropertyChanged事件.
你能解释一下为什么会这样吗?据我所知,PropertyChanged事件强制UI重新读取属性中的值并显示它们,但在我的示例中,数据绑定文本框中的值不会更新.
再次.我知道这是财产的不良实施,但我想重申,这是过于简单化.这只是一个样本.但无论如何,PropertyChanged表示属性已更改,应该更新,但事实并非如此.
我正在尝试使用以下代码将DataColumn Header绑定到DynamicResource.
<Window.Resources>
<sys:String x:Key="HeaderText">Header Text</sys:String>
</Window.Resources>
<Grid>
<tk:DataGrid>
<tk:DataGrid.Columns>
<tk:DataGridTextColumn Header="{DynamicResource HeaderText}" Width="100"/>
</tk:DataGrid.Columns>
</tk:DataGrid>
</Grid>
Run Code Online (Sandbox Code Playgroud)
但由于一些奇怪的原因,列标题仍为空.然而,StaticResource效果很好.你能帮我弄清楚如何将Header属性绑定到某些DynamicResource.