0

内部に 2 つのボタン (「MinusBtn」と「PlusBtn」) がある WPF のスライダー コントロールのカスタム スタイル (テンプレートを含む) を作成しました。

ここで、4 つの異なるスライダーに同じスライダー カスタム スタイルを使用し、4 つのスライダー ("MinusBtn_Clicked" イベントと "PlusBtn_Clisked" イベント) のすべてでボタンを押すと、ボタンが同じことを行うようにします。しかし、どのスライダーがイベントを呼び出したかを知る必要があります。

ボタンはジェネリック スタイルで構成されているため、親によってそれを知ることはできません。どうすればこれを修正できますか? このイベントのデリゲートにパラメーターを追加できますか?

これが私のカスタムスタイルです:

 <Style x:Key="MyCustomStyleForSlider" TargetType="{x:Type Slider}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type Slider}">  
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="10.5"/>
                            <RowDefinition Height="Auto" MinHeight="{TemplateBinding Slider.MinHeight}"/>
                            <RowDefinition Height="Auto"/>
                        </Grid.RowDefinitions>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="47*"/>
                            <ColumnDefinition Width="331*"/>
                            <ColumnDefinition Width="47*"/>
                        </Grid.ColumnDefinitions>

                        <TickBar Name="BottomTick" SnapsToDevicePixels="True" Grid.Row="2" Fill="{TemplateBinding Foreground}"
                                Placement="Bottom"
                                Height="4"
                                Visibility="Collapsed" />

                        <Grid x:Name="JustTrack" Height="20" Width="335" Grid.RowSpan="1" Grid.Row="0" Grid.Column="1" Grid.ColumnSpan="1">
                            <Track Grid.Row="1" Name="PART_Track">
                                <Track.DecreaseRepeatButton>
                                    <RepeatButton Style="{StaticResource DecreaseSliderButtonStyle}"  />
                                </Track.DecreaseRepeatButton>
                                <Track.Thumb>
                                    <Thumb Style="{StaticResource SliderThumbStyle}" />
                                </Track.Thumb>
                                <Track.IncreaseRepeatButton>
                                    <RepeatButton Style="{StaticResource SliderButtonStyle}" />
                                </Track.IncreaseRepeatButton>
                            </Track>
                        </Grid>
                    <Grid x:Name="Minus" Grid.Column="0" Grid.RowSpan="3" Width="47" Height="40">
                            <Button x:Name="MinusBtn" Click="MinusBtn_Click" >
                                <Button.Template>
                                    <ControlTemplate>
                                        <Ellipse Height="25" Width="25" Fill="Transparent"></Ellipse>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                        </Grid>
                        <Grid x:Name="Plus" Grid.Column="2" Grid.RowSpan="3" Width="47" Height="40">
                            <Button x:Name="PlusBtn" Click="PlusBtn_Click">
                                <Button.Template>
                                    <ControlTemplate>
                                        <Ellipse Height="25" Width="25" Fill="Transparent"></Ellipse>
                                    </ControlTemplate>
                                </Button.Template>
                            </Button>
                        </Grid>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="TickPlacement" Value="BottomRight">
                            <Setter TargetName="BottomTick" Property="Visibility" Value="Visible"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
4

1 に答える 1

3

ボタンでスライダーの値を増減したい場合。ボタンのCommandプロパティを使用します。

<Grid x:Name="Minus" Grid.Column="0" Grid.RowSpan="3" Width="47" Height="40">
    <Button x:Name="MinusBtn" Command="Slider.DecreaseSmall">
        <Button.Template>
            <ControlTemplate>
                <Ellipse Height="25" Width="25" Fill="Transparent"></Ellipse>
            </ControlTemplate>
        </Button.Template>
    </Button>
</Grid>
<Grid x:Name="Plus" Grid.Column="2" Grid.RowSpan="3" Width="47" Height="40">
    <Button x:Name="PlusBtn" Command="Slider.IncreaseSmall">
        <Button.Template>
            <ControlTemplate>
                <Ellipse Height="25" Width="25" Fill="Transparent"></Ellipse>
            </ControlTemplate>
        </Button.Template>
    </Button>
</Grid>

または、イベントハンドラーにスライダーが本当に必要な場合は、次の操作を実行できます。

private void Button_Click(object sender, RoutedEventArgs e)
{
    FrameworkElement frameworkElement = (FrameworkElement)sender;
    Slider slider = (Slider)frameworkElement.TemplatedParent;
}
于 2013-01-28T17:56:12.813 に答える