Hinzufügen eine benutzerdefinierte Abhängigkeitseigenschaft zu einer Steuerungsvorlage in XAML

stimmen
4

Ich habe es geschaffen mit meiner Lese bekomme weiter nur Box nach einem bisschen Pause überprüfen und habe nun die Funktionalität, die ich in einer einigermaßen eleganten Form möge. Das Problem ist, ich habe ein bisschen ein Hack verwendet, damit es funktioniert, obwohl dies nicht eine Katastrophe wäre es schön, es besser zu machen.

Zur Erinnerung: Ich möchte ein regelmäßiges aussehendes Checkbox, das nicht selbst überprüfen tut, wenn es angeklickt wird, anstatt das Click-Ereignis löst einen Hintergrund Arbeiter, die später auf eine Variable aktualisiert werden verursacht. Diese Variable ist verpflichtet, checkbox.ischecked und es wird dann mit dem neuen Wert aktualisiert.

Ich möchte eine Kontrolle Vorlage verwenden basiert auf der Idee hier:

Eine Nur-Lese-CheckBox in C # WPF

Ich habe dies geändert und gezupft Sachen, die ich dachte, dass ich nicht brauchen (vielleicht unbedacht) und endete mit:

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

Diese Checkbox funktioniert wie oben beschrieben und ich es so nennen:

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

Der Hack, den ich machte, war den ‚Tag‘ DependencyProperty zu verwenden, um die Daten zu tragen in die Steuervorlage zu binden. Dies umgeht, was Mechanismus ist normalerweise das Kontrollkästchen Selbsttest verursacht. Um wieder eine Checkbox normalen Handeln nur verbindlich ändern Tag eine Bindung an IsChecked und innerhalb des BulletDecorator stellen Sie die Template zu IsChecked statt Tag.

Also ich denke, meine Fragen sind:

  1. Habe ich das falsche Ende des Stockes? Gibt es einen Ort, wo ich außer Kraft setzen kann, was Mechanismus, um die Box zu Selbsttest verursacht? Vielleicht in Control Trigger?
  2. Ist es eine gute Idee zu gehen, um jede freie XAML zu beseitigen, die ich denke nur, wird von der Standard-CheckBox gebracht oder sollte ich versuchen, und halten einen vollständigen Ersatz für alle Arten?
  3. Wenn das, was ich tue, ist nicht zu verrückt, kann ich eine Abhängigkeitseigenschaft in XAML hinzufügen, so dass ich nicht die Tag-Eigenschaft verwenden müssen?
  4. Es kommt auch zu mir, dass vielleicht das, was ich wirklich will, ein Button-Steuerelement ist, das wie ein Kontrollkästchen aussieht, vielleicht eine unsichtbare Schaltfläche mit der üblichen animierten Checkbox auf denen ich band Daten an die Grafik. Irgendwelche Gedanken auf diesem Plan wäre auch sehr willkommen.

Vielen Dank

Ed

Veröffentlicht am 06/07/2009 um 20:53
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
6

Ich konnte dieses Problem und meine ReadOnlyCheckBox Idee aussortieren, am Ende habe ich auf Basis Knopf eine benutzerdefinierte Steuerung erstellt und angewendet dann einen Stil wie ein CheckBox aussehen zu lassen. Ich habe meine eigene IsChecked Eigenschaft, die nicht gesetzt bekommt, wenn die Klicks Benutzer, sondern an die Daten gebunden ist, so dass nur die angezeigten Häkchen angezeigt, wenn die Datenänderungen.

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>

Beantwortet am 16/07/2009 um 08:24
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more