1

XAML を使用して WPF ユーザー コントロールを作成しようとしていますが、これは昔ながらのチェックボックス コントロールであり、以下のコードは画面上では問題ないように見えますが、コントロールの状態を変更するには、ボックス内のどこにもないパスをクリックする必要があります。間違っている?

あなたが正しく見ることができるように、私はWPFに関しては少し初心者なので、私が本当に悪いことをしていることがあればコメントしてください。

<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Class="BFCheckBoxTest.BFCheckBox"
x:Name="UserControl"
d:DesignWidth="55" d:DesignHeight="55">
<UserControl.Resources>
    <SolidColorBrush x:Key="CheckBoxFillNormal" Color="#F4F4F4"/>
    <SolidColorBrush x:Key="CheckBoxStroke" Color="#8E8F8F"/>
    <Style x:Key="EmptyCheckBoxFocusVisual">
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle Margin="1" SnapsToDevicePixels="true" Stroke="Black" StrokeThickness="1" StrokeDashArray="1 2"/>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="BFCheckBoxStyle" TargetType="{x:Type CheckBox}">
        <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
        <Setter Property="Background" Value="{StaticResource CheckBoxFillNormal}"/>
        <Setter Property="BorderBrush" Value="{StaticResource CheckBoxStroke}"/>
        <Setter Property="BorderThickness" Value="1"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource EmptyCheckBoxFocusVisual}"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <Grid x:Name="Controlgrid" Height="{TemplateBinding ActualHeight}" Width="{TemplateBinding ActualWidth}">
                        <Border x:Name="border" BorderBrush="Black" BorderThickness="1" HorizontalAlignment="Left" Height="{Binding ActualHeight, ElementName=Controlgrid}" VerticalAlignment="Bottom" Width="{Binding ActualWidth, ElementName=Controlgrid}" Grid.ColumnSpan="1" RenderTransformOrigin="0.518,0.127" d:IsLocked="True"/>
                        <Viewbox x:Name="CrossViewbox" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="Auto" Margin="4" Visibility="Hidden">
                            <Path x:Name="Cross" Data="M0,55 L55,0 M0,0 L55,55" HorizontalAlignment="Left" Height="{Binding ActualHeight, ElementName=border}" Margin="0" Stretch="Fill" Stroke="Red" StrokeThickness="2" VerticalAlignment="Bottom" Width="{Binding ActualWidth, ElementName=border}" Grid.ColumnSpan="1" Focusable="False"/>
                        </Viewbox>
                        <Viewbox x:Name="TickViewBox" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="4" RenderTransformOrigin="0.373,0.225" Visibility="Visible">
                            <Path x:Name="Tick" Data="M0,35 L20,55 L55,0" HorizontalAlignment="Left" Height="{Binding ActualHeight, ElementName=border}" Margin="0" Stretch="Fill" Stroke="Green" StrokeThickness="2" VerticalAlignment="Bottom" Width="{Binding ActualWidth, ElementName=border}" Grid.ColumnSpan="1" Focusable="False"/>
                        </Viewbox>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="ButtonBase.Click"/>
                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Visibility" TargetName="TickViewBox" Value="Visible" />
                            <Setter Property="Visibility" TargetName="CrossViewbox" Value="Hidden" />
                        </Trigger>
                        <Trigger Property="IsChecked" Value="false">
                            <Setter Property="Visibility" TargetName="TickViewBox" Value="Hidden" />
                            <Setter Property="Visibility" TargetName="CrossViewbox" Value="Visible" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</UserControl.Resources>

<CheckBox Content="CheckBox" HorizontalAlignment="Left" VerticalAlignment="Top" Style="{DynamicResource BFCheckBoxStyle}" Height="{Binding ActualHeight, ElementName=UserControl}" Width="{Binding ActualWidth, ElementName=UserControl}"/>

私は実際にIPadアプリケーションをWPFに移植する過程にあり、iPadではanimationlayerを使用してパスを手で描いたかのようにアニメーション化しました。パスと期間を指定するだけで非常に簡単で、IOSが世話をします残りのうち、WPFに似たものがありますか、それともWPFでどのように達成しますか??

敬具 Christian Arild Stœr Andersen

4

1 に答える 1

1

その理由は、ControlTemplate で Background Brush をバインドしていないためです。したがって、XAML ControlTemplate でこの変更を行います

<Grid x:Name="Controlgrid" Background="{TemplateBinding Background}">

それ以外は、ブール値のプロパティに対して 2 つのトリガー呼び出しは必要ないため、1 つのトリガーだけで作業が完了します。

<Trigger Property="IsChecked" Value="true">
    <Setter Property="Visibility" TargetName="TickViewBox" Value="Visible" />
    <Setter Property="Visibility" TargetName="CrossViewbox" Value="Hidden" />
</Trigger>
于 2013-07-26T09:42:33.780 に答える