2013-07-04 15 views

cevap

64

LeftToRight içeriğe sahip bir RightToLeft onay kutusunu yapmaktır "kolaylık" ve "doğruluğunu" maksimize bir çözüm TextBlock orada yerleştirebilirsiniz:

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

Yoksa bir stil isterseniz:

<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

Söylemeliyim, evet, bu gerçekten kolay ... – punker76

+16

Bu sebepten dolayı, bu onay işaretini gliflendiren (* not: * .NET 4.5) onay işaretini döndürür. En iyi bahis orijinal stilin bir kopyasını düzenlemek ve bunu işlemek için şablonu özelleştirmek olacaktır. – erodewald

+1

Bazı insanlar varsayılan 'CheckBox' stilinin bir kopyasının nasıl elde edileceğinin farkında olmayabilirler, benim uygulamamı (ekli özellikleri kaldıran) bir [gist] 'e atmaya karar verdim (https://gist.github.com/** "CheckBox" stilini içeren "generic/be2aa4a6d2d82739b835)" ControlTemplate.Triggers "bazı küçük değişiklikler ile. Çözümünüzde – erodewald

25

: XAML içinde

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

:

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

DÜZENLEME

punker76 o nokta üst üste fark bana yardımcı Kullanıcı ":" yerler olmak zorunda Infront metnin doğru olarak görüntülenmesini, sonunda ("CheckBox Enabled:"), muhtemelen bir etki akışı yönünden kaynaklanan metin öğesinde var. Güzel yakalayış.

+2

. Bunun nedeni, CheckBox'ı oluşturan tüm bileşenlerin FlowDirection özelliğini miras almasıdır. Çözüm burada açıklanmıştır: [link] (http://stackoverflow.com/questions/20911471/wpf-button-icon-gets-mirrored-why/20912496#20912496) –

+0

@ punker76 Aynı sorun ": ABC neden olur msgstr "ABC:" olarak gösterilecek. ContentPresenter'ın FlowDirection öğesini LeftToRight olarak ayarlamak, metni soldan sağa komut dosyaları için beklendiği gibi yapar. –

14

başka yolu da yeni bir özel stile yapmaktır

<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> 

kullanımı: yardımcı

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

enter image description here

umut!

+3

Sanırım hepimiz bu cevabın farkındaydık ve bu problemi çözmenin doğru yolu olduğunu biliyoruz, ama "en kolay" yol sadece akış yönünü değiştirmektir. :) –

+1

@LepiPerke tamam, soldaki ":" ile bu iyi :-) – punker76

+9

Bu cevap gerçekten doğru olarak işaretlenmiş olmalıdır. Tüm doğru şeyleri yapar ve ters çevrilmiş onay işaretleriyle ve tersine çevrilmiş metinle ilgili bir problemi yoktur. FlowDirection kullanımını savunan yanıt, karakter sırası ve simetrik olmayan onay işaretleri için tutarlı bir şekilde çalışmaz. –

0

Onay kutusu şablonu düzenleyebilir ve üzerinde önde dikdörtgenin

11

Başka geçici çözümü, ince sorunlar di önlemek için Tamamen yeni bir CheckBox stili tanımlarken akış yönü ve kod büyük miktarda ile scussed, sadece bir Label (istenilen CheckBox içerik dizesi ile) içeren bir WrapPanel ve bir CheckBox (hiçbir içerik dizisi olmadan) kullanmaktır.

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

kolay yolu yığın paneli kullanmaktır: Ben bunun için iki saat geçirdim

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

Eğer metin – failedprogramming

+1

olay işleyicileri ile başa çıkabilirken kontrol etmek için işaretleme/işaretini kaldırma yeteneğini kaybetme sakıncası yoksa bu tamam – simonalexander2005

8

, ama en iyi kararı

<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

Ben bir süre oldu biliyorum bulundu ve Geciktim. Ancak bazı karmaşık cevaplardan geçtikten ve internette çok fazla arama yaptıktan sonra, here işaretini bozmadan bunu başarmanın en kolay yolunu buldum.

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

Sonuç: sizin onay işareti yatay olarak çevrilir alır, en azından bir vuruş dizisi olarak uygulanır: Bu bir sorun var

enter image description here

İlgili konular