我正在尝试在C#中以编程方式编辑TextBox
Width属性,但最终的最佳行为应该是在将应用打开到1000然后使用Slider
进行修改时默认值。
这是我用来为Width
属性设置数据绑定的代码。
<TextBox x:Name="MainTextArea"
Margin="0,71"
BorderThickness="0"
Background="{x:Null}"
BorderBrush="{x:Null}"
SelectionHighlightColor="#FF444444"
Foreground="White"
Canvas.ZIndex="1"
TabIndex="1"
Padding="0"
FontSize="18"
FontFamily="Georgia"
IsSpellCheckEnabled="False"
HorizontalAlignment="Center"
RequestedTheme="Dark"
Width="{Binding TextAreaWidth}"
TextChanged="MainTextArea_TextChanged"
TextWrapping="Wrap"
AcceptsReturn="True"
PlaceholderText=""
/>
这是我用来尝试绑定属性的代码。 (已从此处复制和修改http://msdn.microsoft.com/en-gb/library/windows/apps/xaml/hh758320.aspx)
public class MyWidth : INotifyPropertyChanged
{
private FrameworkElement _width;
// Declare the PropertyChanged event.
public event PropertyChangedEventHandler PropertyChanged;
// Create the property that will be the source of the binding.
public FrameworkElement width
{
get { return _width; }
set
{
_width = value;
// Call NotifyPropertyChanged when the source property
// is updated.
NotifyPropertyChanged("TextAreaWidth");
}
}
// NotifyPropertyChanged will fire the PropertyChanged event,
// passing the source property that is being updated.
public void NotifyPropertyChanged(string WidthProperty)
{
if (PropertyChanged != null)
{
PropertyChanged(this,
new PropertyChangedEventArgs(WidthProperty));
}
}
}
然后我尝试在MainPage类中设置它。
public MainPage()
{
this.InitializeComponent();
// Create an instance of the MyWidth class
// that implements INotifyPropertyChanged.
MyWidth mywidth = new MyWidth();
mywidth.width = new FrameworkElement; // this line is not recognized, I suppose it is incomplete, but I don't know what to write there.
MainTextArea.DataContext = mywidth;
// Create the binding and associate it with the text box.
Binding binding = new Binding() { Path = new PropertyPath("TextAreaWidth") };
MainTextArea.SetBinding(TextBox.WidthProperty, binding);
}
目前mywidth.width = new FrameworkElement;
未被识别为有效行,我认为它不完整,但我不知道该写什么。在示例中,创建了一个新的SolidColorBrush并用于将颜色设置为红色,但我不知道如何在Framework元素示例中使用它。
要使用滑块,我想我需要在Slider的ValueChanged
事件中调用其中一个类。
帮助?
@ BryanStump的答案是正确的并且确实解决了我的问题,因为我收到NullReferenceException
错误。
然而,当我自己尝试修复它时,我学会了如何正确地将Slider
的值绑定到TextBox
的Width属性,如下所示:
<TextBox x:Name="MainTextArea"
Margin="0,71"
BorderThickness="0"
Background="{x:Null}"
BorderBrush="{x:Null}"
SelectionHighlightColor="#FF444444"
Foreground="White"
Canvas.ZIndex="1"
TabIndex="1"
ScrollViewer.HorizontalScrollBarVisibility="Hidden"
Padding="0"
FontSize="18"
FontFamily="Georgia"
IsSpellCheckEnabled="False"
HorizontalAlignment="Center"
RequestedTheme="Dark"
Width="{Binding Value, ElementName=TextBoxSizeSlider}"
TextChanged="MainTextArea_TextChanged"
TextWrapping="Wrap"
AcceptsReturn="True"
PlaceholderText="" Loaded="MainTextArea_Loaded" />
注意宽度是如何绑定到Slider
的值。
答案 0 :(得分:1)
如果您要在滑块TextBox
事件中设置valueChanged
的宽度,那么为什么不直接在事件处理程序中执行此操作?
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs e)
{
textBox.Width = e.newValue;
}
然后,您可以在XAML中设置默认值1000。不需要绑定吗?
编辑:
关于NullReferenceException
,请查看此问题:WPF Slider control (NullReferenceException)
它注意到,一旦创建了滑块,它就会引发ValueChanged
事件,这可能会导致问题,具体取决于XAML的顺序。
它提到最简单的解决方法是在ValueChanged
事件中捕获空对象,但更好的选择是在XAML中将值绑定在一起(而不是在后面的代码中)。
答案 1 :(得分:0)
Textbox为null,因为它尚未加载。
private void Slider_OnValueChanged(object sender, RangeBaseValueChangedEventArgs e)
{
if (TextBox != null)
{
TextBox.Width = e.NewValue;
}
}
如果在滑块值更改后加载文本框,则会错过初始值
private void TextBox_OnLoaded(object sender, RoutedEventArgs e)
{
if (Slider != null)
{
TextBox.Width = Slider.Value;
}
}