更改FlowDirection时,CheckBox会镜像

时间:2014-06-14 06:19:49

标签: wpf

O.S。 :Microsoft Windows 8.1 开发应用程序:Microsoft Visual Studio 2013(WPF App开发)

我已经从Windows 7迁移到Windows 8.1,现在我在VS2012中开发的旧应用程序有一种奇怪的方式。因为我的语言是从右到左,我使用RightToLeft作为FlowDirection。它工作正常,因为CheckBox的左侧显示了所有文本,但现在CheckBox的刻度符号被镜像:

enter image description here

即使是从右到左的语言,刻度线也不正确。这是因为O.S.或VS2013,我该如何解决?我需要创建一个模板吗?感谢。

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题,这是我发现的最佳解决方案。路径是绘制勾号的路径,因此只需将其流向更改回LeftToRight即可使其按预期绘制。

<CheckBox Content="My Checkbox" FlowDirection="RightToLeft">
    <CheckBox.Resources>
         <Style TargetType="{x:Type Path}">
               <Setter Property="FlowDirection" Value="LeftToRight"/>
         </Style>
    </CheckBox.Resources>
</CheckBox>

答案 1 :(得分:4)

<Grid>
    <Grid.Resources>
        <Style x:Key="ArabicStyle" TargetType="{x:Type CheckBox}">
            <Style.Resources>
                <Style TargetType="{x:Type Path}">
                    <Setter Property="FlowDirection" Value="LeftToRight"/>
                </Style>
            </Style.Resources>
        </Style>
    </Grid.Resources>
    <CheckBox Content="My Checkbox:" Style="{StaticResource ArabicStyle}"/>
</Grid>

答案 2 :(得分:0)

当你想使用标准的Checkbox Control时,将路径的FlowDirection设置为LeftToRight会有效但是如果你创建一个自定义模板它不起作用所以为这个CheckBox创建一个自定义样式模板并将主Grid的FlowDirection设置为LeftToRight “:

     <Style TargetType="{x:Type CheckBox}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Height" Value="30" />
        <Setter Property="FocusVisualStyle" Value="{DynamicResource MyFocusVisualStyte}" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type CheckBox}">
                    <BulletDecorator>
                        <BulletDecorator.Bullet>
                            <!-- ****************** here set FlowDirection to LeftToRight *********************************** -->
                            <Grid      FlowDirection="LeftToRight" Height="{TemplateBinding Height}" Width="{Binding RelativeSource={RelativeSource Self}, Path=Height, UpdateSourceTrigger=PropertyChanged}"
                          MinHeight="30" MinWidth="30" ShowGridLines="False">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="4*" />
                                    <ColumnDefinition Width="1*" />
                                    <ColumnDefinition Width="1*" />
                                    <ColumnDefinition Width="4*" />
                                    <ColumnDefinition Width="1*" />
                                    <ColumnDefinition Width="1*" />
                                    <ColumnDefinition Width="2*" />
                                    <ColumnDefinition Width="2*" />
                                </Grid.ColumnDefinitions>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="3*" />
                                    <RowDefinition Height="1*" />
                                    <RowDefinition Height="1*" />
                                    <RowDefinition Height="1*" />
                                    <RowDefinition Height="4*" />
                                    <RowDefinition Height="1*" />
                                    <RowDefinition Height="1*" />
                                    <RowDefinition Height="4*" />
                                </Grid.RowDefinitions>

                                <Border Name="MainBorder"
                                Grid.ColumnSpan="9" Grid.RowSpan="9"
                                CornerRadius="4"
                                BorderThickness="1"
                                Background="Transparent" />

                                <Border Name="InnerBorder"
                                Grid.Column="1" Grid.ColumnSpan="5"
                                Grid.Row="2" Grid.RowSpan="5"
                                BorderThickness="1"
                                BorderBrush="#808080" />

                                <Path Name="InnerPath"

                              Grid.Column="1" Grid.ColumnSpan="5"
                              Grid.Row="2" Grid.RowSpan="5"
                              Data="M31,5 L19.5,5 19.5,19.5 34.5,19.5 34.5,11.75"
                              Stretch="Fill" Stroke="Red"/>

                                <Path Name="CheckMark"
                              Grid.Column="2" Grid.ColumnSpan="5"
                              Grid.Row="1" Grid.RowSpan="5"
                              Opacity="0"
                              Data="M9.07743946676476E-09,4.31805768640244L4.68740335877841,8.86361158398516C4.68740335877841,8.86361158398516,16.3281249985376,-2.42451336648723,16.3281249985376,-2.42451336648723L14.0622100581796,-4.77304938341948 4.68740335877846,4.31805791992662 2.22656251699567,1.93164208562579z"
                              Fill="#3babe3"
                              Stretch="Fill"
                              Stroke="#3babe3" />

                                <Path Name="InderminateMark"
                              Grid.Column="3"
                              Grid.Row="4"
                              Data="M0,4 L1,5 5,1 4,0"
                              Opacity="0"
                              Stretch="Fill"
                              StrokeThickness="0"
                              Fill="#808080" />
                            </Grid>
                        </BulletDecorator.Bullet>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CheckStates">
                                <VisualState x:Name="Checked">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         Storyboard.TargetName="CheckMark" Duration="0:0:0.2" To="1" />
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Unchecked" >
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         Storyboard.TargetName="CheckMark" Duration="0:0:0.2" To="0" />
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Indeterminate">
                                    <Storyboard>
                                        <DoubleAnimation Storyboard.TargetProperty="Opacity"
                                         Storyboard.TargetName="InderminateMark" Duration="0:0:0.2" To="1" />
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter Margin="4,0,4,0"
                    VerticalAlignment="Center"
                    HorizontalAlignment="Left"
                    RecognizesAccessKey="True" />
                    </BulletDecorator>

                    <ControlTemplate.Triggers>
                        <Trigger Property="IsChecked" Value="True">
                            <Setter TargetName="InnerBorder" Property="Visibility" Value="Collapsed" />
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="MainBorder" Property="Background" Value="#81d2eb" />
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="CheckMark" Property="Fill" Value="#cccccc" />
                            <Setter TargetName="CheckMark" Property="Stroke" Value="#cccccc" />
                            <Setter TargetName="InnerPath" Property="Stroke" Value="#cccccc" />
                            <Setter TargetName="InderminateMark" Property="Fill" Value="#cccccc" />
                            <Setter TargetName="InnerBorder" Property="BorderBrush" Value="#cccccc" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

    <Style x:Key="MyFocusVisualStyte" >
        <Setter Property="Control.Template">
            <Setter.Value>
                <ControlTemplate>
                    <Rectangle x:Name="FocusStyle" StrokeDashArray="4 4" RadiusX="5" RadiusY="5" Fill="Transparent"
                       Stroke="#81d2eb" StrokeThickness="1" />
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>