2011-09-30 88 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