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













