2009-07-06 2 views
4

мне удалось получить еще с моим только для чтения флажок после небольшого перерыва и теперь имеют функциональные возможности, я хочу в достаточно элегантной форме. Проблема в том, что я использовал немного взлома, чтобы заставить его работать, хотя это не катастрофа, было бы неплохо сделать это лучше.Добавление пользовательского свойства зависимостей для шаблона управления в XAML

Напомню: я хочу, чтобы флажок регулярного поиска не проверялся при щелчке по нему, вместо этого событие click запускает фоновый рабочий, который впоследствии вызывает обновление переменной. Эта переменная привязана к checkbox.ischecked и затем обновляется с новым значением.

Я хотел бы использовать шаблон управления на основе идеи здесь:

A read-only CheckBox in C# WPF

Я модифицированном это и раздел материал, который я думал, что я не нужен (возможно неосторожно) и в конечном итоге с :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> 
<!-- --> 
<Style x:Key="ReadOnlyCheckBoxStyle" TargetType="{x:Type CheckBox}" > 
     <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type CheckBox}"> 
       <BulletDecorator SnapsToDevicePixels="true" Background="Transparent"> 
        <BulletDecorator.Bullet> 
         <Microsoft_Windows_Themes:BulletChrome Background="{TemplateBinding Background}" 
                   BorderBrush="{TemplateBinding BorderBrush}" 
                   RenderMouseOver="{TemplateBinding IsMouseOver}" 
                   IsChecked="{TemplateBinding Tag}"> 
         </Microsoft_Windows_Themes:BulletChrome> 
        </BulletDecorator.Bullet> 
        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
             HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
             Margin="{TemplateBinding Padding}" 
             VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
             RecognizesAccessKey="True" /> 
       </BulletDecorator> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Этот флажок работает, как описано выше, и я называю это так:

<CheckBox x:Name="uiComboBox" Content="Does not set the backing property, but responds to it." 
        Style="{StaticResource ReadOnlyCheckBoxStyle}" Tag="{Binding MyBoolean}" Click="uiComboBox_Click"/> 

Хак, который я сделал, должен был использовать свойство «Tag» DependencyProperty для переноса привязки данных в шаблон управления. Это обходит любой механизм, который обычно вызывает проверку флажка. Чтобы вернуться в нормальный режим, просто измените привязку к тегу к привязке к IsChecked, а внутри BulletDecorator установите TemplateBinding для IsChecked вместо тега.

Так что я думаю, мои вопросы:

  1. У меня неправильный конец палки? Есть ли место, где я могу переопределить любой механизм, заставляющий ящик самостоятельно проверять? Возможно, в ControlTemplate Triggers?
  2. Это хорошая идея, чтобы обойти любые запасные XAML, которые, как мне кажется, только что ввели из CheckBox по умолчанию или я должен попытаться сохранить полную замену для всех стилей?
  3. Если я не слишком сумасшедший, могу ли добавить свойство зависимостей в XAML, чтобы мне не пришлось использовать свойство Tag?
  4. Мне также приходит в голову, что, возможно, я действительно хочу, это кнопка управления, которая выглядит как флажок, возможно, невидимая кнопка с обычным анимированным флажком сверху, на который я привязываю данные к графике. Любые мысли по этому плану также будут очень желанными.

Большое спасибо

Ed

ответ

6

мне удалось разобраться в этой проблеме и мою ReadOnlyCheckBox идею, в конце концов, я создал пользовательский элемент управления на основе вокруг кнопки, а затем применили стиль, чтобы она выглядела как CheckBox. Я добавил собственное свойство IsChecked, которое не устанавливается, когда пользователь нажимает, но привязан к данным, поэтому отображаемая проверка появляется только при изменении данных.

C#:

public class ReadOnlyCheckBoxControl : System.Windows.Controls.Button 
{ 
    public static DependencyProperty IsCheckedProperty; 

    public ReadOnlyCheckBoxControl() 
    { 
     DefaultStyleKeyProperty.OverrideMetadata(typeof(ReadOnlyCheckBoxControl), new FrameworkPropertyMetadata(typeof(ReadOnlyCheckBoxControl))); 
    } 

    public bool IsChecked 
    { 
     get { return (bool)GetValue(IsCheckedProperty); } 
     set { SetValue(IsCheckedProperty, value); } 
    } 

    static ReadOnlyCheckBoxControl() 
    { 
     IsCheckedProperty = DependencyProperty.Register("IsChecked", typeof(bool), typeof(ReadOnlyCheckBoxControl)); 
    } 
} 

XAML:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:y="clr-namespace:ReadOnlyCheckBoxControlNS;assembly=" 
xmlns:Microsoft_Windows_Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero"> 

<SolidColorBrush x:Key="CheckBoxFillNormal" Color="#F4F4F4" /> 
<SolidColorBrush x:Key="CheckBoxStroke" Color="#8E8F8F" /> 

<Style x:Key="EmptyCheckBoxFocusVisual"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Rectangle SnapsToDevicePixels="true" 
          Margin="1" 
          Stroke="Black" 
          StrokeDashArray="1 2" 
          StrokeThickness="1" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="CheckRadioFocusVisual"> 
    <Setter Property="Control.Template"> 
     <Setter.Value> 
      <ControlTemplate> 
       <Rectangle SnapsToDevicePixels="true" 
          Margin="14,0,0,0" 
          Stroke="Black" 
          StrokeDashArray="1 2" 
          StrokeThickness="1" /> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style TargetType="{x:Type y:ReadOnlyCheckBoxControl}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type y:ReadOnlyCheckBoxControl}"> 
       <BulletDecorator SnapsToDevicePixels="true" Background="Transparent"> 
        <BulletDecorator.Bullet> 
         <Microsoft_Windows_Themes:BulletChrome Background="{StaticResource CheckBoxFillNormal}" 
                   BorderBrush="{StaticResource CheckBoxStroke}" 
                   RenderMouseOver="{TemplateBinding IsMouseOver}" 
                   IsChecked="{TemplateBinding IsChecked}"> 
         </Microsoft_Windows_Themes:BulletChrome> 
        </BulletDecorator.Bullet> 
        <ContentPresenter SnapsToDevicePixels="True" 
             HorizontalAlignment="Left" 
             Margin="4,0,0,0" 
             VerticalAlignment="Center" 
             RecognizesAccessKey="True" /> 
       </BulletDecorator> 
       <ControlTemplate.Triggers> 
        <Trigger Property="HasContent" Value="true"> 
         <Setter Property="FocusVisualStyle" Value="{StaticResource CheckRadioFocusVisual}" /> 
         <Setter Property="Padding" Value="4,0,0,0" /> 
        </Trigger> 
        <Trigger Property="IsEnabled" Value="false"> 
         <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.GrayTextBrushKey}}" /> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Смежные вопросы