Legge til en tilpasset avhengighet annonsen til en kontroll mal i XAML

stemmer
4

Jeg har klart å komme lenger med min merket for Skrive etter en liten pause, og nå har den funksjonaliteten jeg ønsker i en rimelig elegant form. Problemet er at jeg har brukt litt av en hack for å gjøre det arbeidet, selv om dette ikke er en katastrofe det ville være fint å gjøre det bedre.

For å oppsummere: Jeg vil ha en vanlig utseende boksen som ikke selv sjekke når den blir klikket, istedenfor å klikke hendelsen utløser en bakgrunn arbeidstaker som senere fører til en variabel for å bli oppdatert. Denne variabelen er bundet til checkbox.ischecked og det er da oppdatert med den nye verdien.

Jeg ønsker å bruke en kontroll mal basert på ideen her:

En skrivebeskyttet avmerkingsbokser i C # WPF

Jeg har endret dette, og strippet ut ting jeg trodde jeg ikke trenger (kanskje uklokt) og endte opp med:

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

Denne boksen fungerer som beskrevet ovenfor, og jeg kaller det slik:

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

De utstansede jeg laget var å anvende for etiketter DependencyProperty å bære databindings inn i styremalen. Dette forbigår hva mekanismen er vanligvis forårsaker boksen til selvkontroll. For å gå tilbake til en normal fungerende avkrysnings bare endre binding til Tag til en binding til IsChecked og inne i BulletDecorator sette TemplateBinding til IsChecked stedet for Tag.

Så jeg antar mitt spørsmål er:

  1. Har jeg fått feil ende av pinnen? Er det et sted hvor jeg kan overstyre hva mekanisme gjør at boksen for å selv sjekke? Kanskje i ControlTemplate utløsere?
  2. Er det en god idé å gå rundt å eliminere noen reservedeler XAML som jeg tror er bare å bli hentet inn fra standard avmerkingsbokser eller skal jeg prøve og holde en komplett erstatning for alle stilarter?
  3. Hvis det jeg gjør er ikke så gal, kan jeg legge til en avhengighet eiendom i XAML, slik at jeg ikke trenger å bruke Tag eiendom?
  4. Det oppstår også for meg at kanskje det jeg egentlig ønsker er en knapp kontroll som ser ut som en avkrysnings, kanskje en usynlig knapp med den vanlige animerte boksen på toppen som jeg binder data til grafiske av. Noen tanker om at planen vil også være svært velkommen.

Tusen takk

Ed

Publisert på 06/07/2009 klokken 19:53
kilden bruker
På andre språk...                            


1 svar

stemmer
6

Jeg klarte å sortere ut dette problemet og min ReadOnlyCheckBox idé, til slutt lagde jeg en egendefinert kontroll basert rundt knappen og deretter brukt en stil å gjøre det ser ut som en avkrysningsboks. Jeg har lagt min egen IsChecked eiendom som ikke får satt når brukeren klikker, men er bundet til dataene slik den vises sjekk bare vises når dataene endres.

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>

Svarte 16/07/2009 kl. 07:24
kilden bruker

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