2013-07-04 13 views

Antwort

64

Eine Lösung, die „Leichtigkeit“ und „Richtigkeit“ ist, um eine RightToLeft Checkbox mit LeftToRight Inhalt maximiert:

<CheckBox FlowDirection="RightToLeft"> 
    <TextBlock FlowDirection="LeftToRight" Text="CheckBox Content:" /> 
</CheckBox> 

Oder wenn Sie einen Stil mögen:

<Style TargetType="CheckBox"> 
    <Setter Property="FlowDirection" Value="RightToLeft" /> 
    <Setter Property="ContentTemplate"> 
     <Setter.Value> 
      <DataTemplate> 
       <ContentControl FlowDirection="LeftToRight" Content="{Binding}" /> 
      </DataTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+1

Ich muss sagen, ja, das ist wirklich einfach ... – punker76

+16

Aus welchem ​​Grund auch immer das Häkchen-Symbol (* Hinweis: * .NET 4.5), die diese Lösung nutzlos macht. Am besten wäre es, eine Kopie des ursprünglichen Stils zu bearbeiten und die Vorlage anzupassen, um damit umzugehen. – erodewald

+1

Da einige Leute vielleicht nicht wissen, wie man eine Kopie des Standard-CheckBox-Stils bekommt, habe ich beschlossen, meine Implementierung (die angehängte Eigenschaften nutzt) auf [a gist] zu setzen (https://gist.github.com)/gen3ric/be2aa4a6d2d82739b835), die den ** full ** 'CheckBox'-Stil mit einigen kleineren Änderungen an den' ControlTemplate.Triggers' beinhaltet. – erodewald

25

In Code:

System.Windows.Controls.CheckBox checkBox = new System.Windows.Controls.CheckBox(); 
checkBox.Content = ":CheckBox Enabled"; 
checkBox.FlowDirection = System.Windows.FlowDirection.RightToLeft; 

In XAML:

<CheckBox FlowDirection="RightToLeft" Content=":CheckBox Enabled" /> 

EDIT

Benutzer punker76 mir geholfen, dass Doppelpunkt bemerken ":" hat Orte sein infront Der Text wird am Ende korrekt angezeigt ("CheckBox Enabled:"), wahrscheinlich durch eine Affektflussrichtung auf das Textelement zurückzuführen. Netter Fang.

+2

Es gibt ein Problem mit diesem: Ihre tick Zeichen wird horizontal gespiegelt, zumindest, wenn es als Hub-Array implementiert. Dies geschieht, weil alle Komponenten, aus denen die CheckBox besteht, die FlowDirection-Eigenschaft erben. Die Lösung wird hier erklärt: [Link] (http://stackoverflow.com/questions/20911471/wpf-button-icon-gets-mirrored-why/20912496#20912496) –

+0

@ punker76 Das gleiche Problem verursacht die ": ABC "als" ABC: "angezeigt werden. Wenn Sie die FlowDirection von ContentPresenter auf LeftToRight festlegen, wird der Text wie erwartet für Skripts von links nach rechts angezeigt. –

14

Eine andere Möglichkeit ist eine neue benutzerdefinierte Stil

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <SolidColorBrush Color="#F4F4F4" 
        x:Key="CheckBoxFillNormal" /> 
    <SolidColorBrush Color="#8E8F8F" 
        x:Key="CheckBoxStroke" /> 
    <Style x:Key="EmptyCheckBoxFocusVisual"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
     <ControlTemplate> 
      <Rectangle Margin="1" 
        SnapsToDevicePixels="true" 
        Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" 
        StrokeDashArray="1 2" 
        StrokeThickness="1" /> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
    <Style x:Key="CheckRadioFocusVisual"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
     <ControlTemplate> 
      <Rectangle Margin="14,0,0,0" 
        SnapsToDevicePixels="true" 
        Stroke="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}" 
        StrokeDashArray="1 2" 
        StrokeThickness="1" /> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
    <Style TargetType="{x:Type CheckBox}" 
     x:Key="ContentLeftCheckBoxStyle"> 
    <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="VerticalContentAlignment" 
      Value="Center" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
     <ControlTemplate TargetType="{x:Type CheckBox}"> 
      <StackPanel Orientation="Horizontal"> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
           Margin="{TemplateBinding Padding}" 
           RecognizesAccessKey="True" 
           SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
           VerticalAlignment="{TemplateBinding VerticalContentAlignment}" /> 
      <BulletDecorator Background="Transparent" 
          SnapsToDevicePixels="true" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}"> 
       <BulletDecorator.Bullet> 
       <Microsoft_Windows_Themes:BulletChrome Background="{TemplateBinding Background}" 
                 BorderBrush="{TemplateBinding BorderBrush}" 
                 IsChecked="{TemplateBinding IsChecked}" 
                 RenderMouseOver="{TemplateBinding IsMouseOver}" 
                 RenderPressed="{TemplateBinding IsPressed}" /> 
       </BulletDecorator.Bullet> 
      </BulletDecorator> 
      </StackPanel> 
      <ControlTemplate.Triggers> 
      <Trigger Property="HasContent" 
        Value="true"> 
       <Setter Property="FocusVisualStyle" 
         Value="{StaticResource CheckRadioFocusVisual}" /> 
       <Setter Property="Padding" 
         Value="0,0,4,0" /> 
      </Trigger> 
      <Trigger Property="IsEnabled" 
        Value="false"> 
       <Setter Property="Foreground" 
         Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
      </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    </Style> 
</ResourceDictionary> 

Nutzung zu machen:

<CheckBox Style="{StaticResource ContentLeftCheckBoxStyle}" Content="CheckBox:" /> 

enter image description here

Hoffnung, das hilft!

+3

Ich denke, wir waren uns alle dieser Antwort bewusst und wir wissen, dass es der richtige Weg ist, um dieses Problem zu lösen, aber "der einfachste" Weg ist, nur die Fließrichtung zu ändern. :) –

+1

@LepiPerke ok, mit dem ":" auf der linken Seite ist es in Ordnung :-) – punker76

+9

Diese Antwort sollte wirklich als richtig markiert werden. Es macht alles richtig und hat keine Probleme mit umgedrehten Häkchen und umgekehrtem Text. Die Antwort, die die Verwendung von FlowDirection befürwortet, funktioniert nicht einheitlich für die Zeichenreihenfolge und nicht symmetrische Häkchen. –

0

Sie können das Kontrollkästchen Vorlage bearbeiten und über können dort platzieren Sie den Textblock vor dem Rechteck

11

eine andere Lösung, die subtilen Probleme di zu vermeiden Bei der Definition eines völlig neuen CheckBox-Stils oben mit Flussrichtung und der großen Menge an Code, verwenden Sie einfach ein WrapPanel, das ein Label (mit der gewünschten CheckBox-Inhaltszeichenfolge) und ein CheckBox (ohne Inhaltszeichenfolge) enthält.

<WrapPanel> 
    <Label Content="Checkbox content"/> 
    <CheckBox VerticalAlignment="Center" Margin="5,0,0,0"/> 
</WrapPanel> 
3

einfachste Weg ist, um einen Stapel Panel zu verwenden:

  <StackPanel Orientation="Horizontal"> 
       <TextBlock Text="Some Text"/> 
       <CheckBox /> 
      </StackPanel> 
+1

ich denke, das ist in Ordnung, wenn es Ihnen nichts ausmacht, die Fähigkeit zu verlieren, zu überprüfen/deaktivieren, wenn Sie auf den Text klicken – failedprogramming

+1

Event-Handler können damit umgehen – simonalexander2005

8

ich zwei Stunden dafür ausgegeben, aber ich fand die beste Entscheidung

<Style x:Key="TextAlignLeft" TargetType="CheckBox"> 
      <Style.Resources> 
       <Style TargetType="Path"> 
        <Setter Property="FlowDirection" Value="LeftToRight" /> 
       </Style> 
       <Style TargetType="TextBlock"> 
        <Setter Property="FlowDirection" Value="LeftToRight" /> 
       </Style> 
      </Style.Resources> 

      <Setter Property="FlowDirection" Value="RightToLeft" /> 
     </Style> 
1

Ich weiß, es ist schon eine Weile und Ich bin spät. Aber nachdem ich mehrere komplizierte Antworten durchgegangen und viel im Internet gesucht habe, fand ich schließlich den einfachsten Weg, dies zu erreichen, ohne den Tick von here zu verzerren.

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

Ergebnis:

enter image description here

Verwandte Themen