如何以编程方式或从滑块设置TextBox宽度

时间:2014-08-02 19:21:33

标签: c# xaml windows-store-apps

我正在尝试在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事件中调用其中一个类。

帮助?

EDIT&amp;替代解决方案

@ 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的值。

2 个答案:

答案 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;
        }
    }