1

そのコードを使用したカスタムユーザーコントロールがあります。

public partial class AudioControl : UserControl
{
    public AudioControl()
    {
        InitializeComponent();
        Value = 0.1;
        DataContext = this;
    }

    public event RoutedPropertyChangedEventHandler<double> ValueChanged = delegate { };

    public int TextWidth
    {
        get { return (int)GetValue(TextWidthProperty); }
        set { SetValue(TextWidthProperty, value); }
    }

    public int SliderWidth
    {
        get { return (int)GetValue(SliderWidthProperty); }
        set { SetValue(SliderWidthProperty, value); }
    }

    public string Header
    {
        get { return (string)GetValue(TextBlock.TextProperty); }
        set { SetValue(TextBlock.TextProperty, value); }
    }

    //public double Value
    //{
    //    get { return (double)GetValue(Slider.ValueProperty); }
    //    set { SetValue(Slider.ValueProperty, value); }
    //}

    public double Value
    {
        get {
            return (double)GetValue(ValueProperty); 
        }
        set { 
            SetValue(ValueProperty, value);
        }
    }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(double), typeof(AudioControl), new UIPropertyMetadata(0));

    public static readonly DependencyProperty TextWidthProperty =
        DependencyProperty.Register("TextWidth", typeof(int), typeof(AudioControl), new UIPropertyMetadata(0));

    public static readonly DependencyProperty SliderWidthProperty =
        DependencyProperty.Register("SliderWidth", typeof(int), typeof(AudioControl), new UIPropertyMetadata(0));

    private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        ValueChanged(this, e);
    }
}

そしてこのXAML:

<UserControl x:Class="Controller.Audio.AudioControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         xmlns:Audio="clr-namespace:Controller.Audio"
         mc:Ignorable="d" 
         d:DesignHeight="23" d:DesignWidth="500" x:Name="audioControl">
<UserControl.Resources>
    <Audio:DoubleToIntConverter x:Key="doubleToInt"/>
</UserControl.Resources>
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="{Binding TextWidth}"/>
        <ColumnDefinition Width="40"/>
        <ColumnDefinition Width="{Binding SliderWidth}"/>
    </Grid.ColumnDefinitions>

    <Label x:Name="txtBlock" Margin="0,0,10,0">
        <Binding Path="Header"/>
    </Label>
    <Label Grid.Column="1" Content="{Binding ElementName=slider, Path=Value, Converter={StaticResource doubleToInt}}"/>
    <Slider x:Name="slider" Grid.Column="2" Style="{StaticResource Office2010SilverSliderStyle}" 
            Value="{Binding Path=Value, ElementName=audioControl}" Minimum="0.0" Maximum="1.0" LargeChange="0.25" TickFrequency="0.01" ValueChanged="Slider_ValueChanged"/>
</Grid>

したがって、起動すると、値バインディングのあるものが間違っているという例外が発生します。コメント付きのバージョン(value-Property)も試してみました。例外はありませんが、そのプロパティの値を設定してもスライダーは変わりません。

誰かがその理由を知っていますか?私はそのようなことをしたことがありません:(

4

1 に答える 1

3

次の依存関係プロパティ宣言にエラーがあります。

public static readonly DependencyProperty ValueProperty =
    DependencyProperty.Register("Value", typeof(double), typeof(AudioControl), new UIPropertyMetadata(0));

ここでの問題は、依存関係プロパティをタイプとして定義しているがdouble、デフォルト値0である。を指定していることですint。に変更0してみてください0.0

コードを実行しましたが、例外が発生しました。最も内側の例外には、次のメッセージが含まれていました。

デフォルト値タイプは、プロパティ「値」のタイプと一致しません。

0上記の行をに変更する0.0と、問題は解決しました。

于 2012-06-04T09:20:06.727 に答える