2011-09-30 87 views
2

我试图在TextBlock中显示滑块控件的值。但是,当我尝试加载对话框时,我不断收到NullRerferenceException。WPF滑块控件(NullReferenceException)

public partial class GeneralSettingsDialog : Window 
{ 

    public GeneralSettingsDialog() 
    { 
     InitializeComponent(); 
    } 

    private void DistSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
    { 
     DistTextBlock.Text = DistSlider.Value.ToString(); 
    } 
} 

XAML:

 <TabItem Header="Miscellaneous" Name="tabItem1" Background="#FFF0F0F0"> 
      <Grid Height="230" Background="#FFF0F0F0"> 
       <TextBlock Height="23" HorizontalAlignment="Left" Margin="13,13,0,0" Name="textBlock1" Text="Spacing" VerticalAlignment="Top" /> 
       <Slider Height="23" HorizontalAlignment="Left" IsSnapToTickEnabled="True" TickPlacement="BottomRight" Margin="13,35,0,0" Name="DistSlider" VerticalAlignment="Top" Width="100" Interval="1" Maximum="50" Minimum="1" ValueChanged="DistSlider_ValueChanged" /> 
       <TextBlock Height="23" HorizontalAlignment="Left" Margin="111,35,0,0" Name="DistTextBlock" Text="TextBlock" VerticalAlignment="Top" /> 

      </Grid> 
     </TabItem> 
+1

尝试调试并检查对象DistSlider.Value是否为null。 –

+0

问题出现在文本块中,因为值在消息框中显示为ok。 – kr13

+0

请出示您的XAML,这里没有水晶球。 :) –

回答

4

也不清楚为什么自己的方式不工作,我想控制时抛出的第一个值改变事件还没有完全初始化。但是,你可以直接这样做的XAML中没有后面的任何代码:

在TextBlock的绑定

直接将滑块的当前值和删除值更改事件处理程序:

Text="{Binding ElementName=DistSlider, Path=Value}" 

PS:

当您连接到滑块的值更改事件在代码隐藏的InitializeComponent()后,你的做法也应该很好地工作:

public MainWindow() 
{ 
    InitializeComponent(); 
    DistSlider.ValueChanged +=new RoutedPropertyChangedEventHandler<double>(DistSlider_ValueChanged); 
} 

private void DistSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e) 
{ 
    DistTextBlock.Text = DistSlider.Value.ToString(); 
} 
+0

这真的很好!谢谢 – kr13

3

在您的XAML你具有TextBlockDistTextBlock定义DistSlider。当第一次加载XAML时,它将触发ValueChanged处理程序,并且DistTextBlock将为空。您可以防止这种在几个方面:

// 1. Naive, but least changes to your code 
if (DistTextBlock != null) 
{ 
    DistTextBlock.Text = DistSlider.Value.ToString(); 
} 

@SvenG's excellent suggestion,其中移动逻辑到XAML(不需要一个ValueChanged处理程序):

<TextBlock Text="{Binding Value, ElementName=DistSlider}" ... /> 

最后你可以使用一个ViewModel (或任何data context supporting INotifyPropertyChanged)来处理传入和传出的值。

使用绑定的重要组成部分,是它可以让你把任何string formatting right alongside its usage在XAML(也就是说,如果此滑块是为货币量):

<TextBlock Text="{Binding Value, ElementName=DistSlider, StringFormat={}{0:C}}" 

使用的最后奖励一个绑定出现在.Net Framework 4.5, which allows you to specify a time delay prior to the binding updating its source。如果绑定用于昂贵的操作,这将使您的GUI看起来更加反应。

<Slider Value="{Binding DollarAmount, Delay=50}" ... /> 
<TextBlock Text="{Binding DollarAmount, StringFormat={}{0:C}}" ... /> 
+1

感谢您的解释!这真的很有帮助。 – kr13

+0

感谢您的友好的话。 延迟绑定属性听起来真的很有帮助,肯定会尝试与4.5 ..感谢提及! – SvenG

+0

@SvenG:不客气,我希望他会选择你的,因为它是第一个是正确的;与事件处理程序!我建议阅读[.Net Framework 4.5 WPF更新日志](http://msdn.microsoft.com/zh-cn/library/bb613588%28v=vs.110%29.aspx)以获得更多期待。 – user7116