當我使用以下行時,從Silverlight類庫實現模板控件;設置XAML屬性在運行時會被覆蓋嗎?
<labelSliderControl:SliderControl x:Name="sldX" Label="X" Value="4" />
我在VS Disign看查看滑塊獲得的4值但是,當我運行應用程序的滑塊從0開始。所以,當我更改屬性在XAML我可以看到的變化,但我也希望在課程的運行時間的值爲4。在這種情況下,depency屬性是否覆蓋了值?
這是Silverlight類庫中的模板控件;
<Style TargetType="local:SliderControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="local:SliderControl">
<Grid x:Name="LayoutRoot" Background="White">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<sdk:Label x:Name="lblLabel" Content="" HorizontalContentAlignment="Center" />
<Slider x:Name="sldValue" Grid.Row="1" Orientation="Vertical" />
<TextBox x:Name="txtValue" Grid.Row="2" MaxWidth="50" MinWidth="50" Text="{Binding ElementName=sldValue, Path=Value, StringFormat=\{0:N2\}}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
[TemplatePart(Name = "sldValue", Type = typeof(Slider)), TemplatePart(Name = "lblLabel", Type = typeof(Label))]
public class SliderControl : Control
{
private Slider _sliderElement;
private Slider SliderElement
{
get { return _sliderElement; }
set {
if (_sliderElement != null)
_sliderElement.ValueChanged -= new RoutedPropertyChangedEventHandler<double>(sldValue_ValueChanged);;
_sliderElement = value;
if (_sliderElement != null)
_sliderElement.ValueChanged += new RoutedPropertyChangedEventHandler<double>(sldValue_ValueChanged);
}
}
public event EventHandler<ValueChangingEventArgs> ValueChanging;
public static readonly DependencyProperty ValueProperty =
DependencyProperty.Register("Value", typeof(double), typeof(SliderControl), new PropertyMetadata(0.0, ValuePropertyChanged));
private static void ValuePropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
{
if (obj is SliderControl)
{
SliderControl sliderUserControl = (SliderControl)obj;
if (sliderUserControl.SliderElement != null)
{
sliderUserControl.SliderElement.Value = (double)args.NewValue;
}
}
}
public SliderControl()
{
this.DefaultStyleKey = typeof(SliderControl);
}
private void sldValue_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
if (ValueChanging != null)
{
ValueChanging(this, new ValueChangingEventArgs(e.OldValue, e.NewValue));
}
}
public override void OnApplyTemplate()
{
SliderElement = GetTemplateChild("sldValue") as Slider;
base.OnApplyTemplate();
}
}
感謝您的快速回復。 – Magiel 2010-09-24 22:42:42
感謝您的快速回復。註冊DependencyProperty時聲明的「Value」屬性被錯誤地發佈。我很抱歉。 我嘗試了你有趣的解決方案,但我正在嘗試使用模板控件。我假設因爲OnApplyTemplate 尚未被調用,我沒有在我的模板控件中將Slider作爲Child控件的引用集。使用附加屬性是否是一個想法,或者我正在考慮從silder繼承整個模板化控件並傳遞所有屬性。我認爲必須有更好的解決方案。 – Magiel 2010-09-24 22:54:57