Přidání vlastní vlastnost závislosti na šabloně Control v XAML

hlasů
4

Podařilo se mi dostat dál s mým čtení políčko jen po chvilce přestávky a nyní mají funkčnost chci v přiměřeně elegantní formu. Problém je, že jsem použil trochu hack, aby to fungovalo, i když to není katastrofa, že by bylo hezké, aby to lépe.

Pro připomenutí: Chci pravidelný vypadající políčka, která nemá vlastní kontrolu, když na něj klepnete, namísto toho událost click spouští pracovník pozadí, které později způsobí proměnné, které mají být aktualizovány. Tato proměnná je vázán na checkbox.ischecked a to je pak aktualizován s novou hodnotou.

Chtěl bych použít kontrolní šablony založené na myšlence zde:

Pouze ke čtení CheckBox v C # WPF

Jsem upravil to i vynechají věci myslel jsem nepotřeboval (možná nerozumně) a skončil s:

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

Toto políčko funguje, jak je popsáno výše, a říkám to takhle:

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

Hack jsem měl použít ‚Tag‘ DependencyProperty nést datové vazby do řídící šablony. To obchází bez ohledu na mechanismus je obvykle způsobuje políčko pro vlastní kontrolu. Chcete-li se vrátit do normálního políčko s hereckou jen změnit vazby na záznamu k navázání na IsChecked a uvnitř BulletDecorator nastavit TemplateBinding na IsChecked místo Tag.

Takže myslím, že mé otázky jsou:

  1. Už jsem dostal špatný konec hůl? Je tam místo, kde můžu přepsat cokoliv mechanismus způsobuje políčko vlastní kontrolu? Možná, že v ControlTemplate Triggers?
  2. Je to dobrý nápad jít kolem eliminuje jakékoliv náhradní XAML, že podle mého názoru je právě přinesl z výchozího CheckBox, nebo bych se měl snažit udržet úplnou náhradu za všechny styly?
  3. Jestli to, co dělám, je příliš bláznivé, můžu přidat vlastnost závislost na XAML, takže nemám používat vlastnost Tag?
  4. Také se mi, že snad to, co opravdu chci, je ovládací prvek tlačítko, které vypadá jako zaškrtávací políčko, možná neviditelná tlačítka s obvyklým animované políčka nahoře, kterou jsem se vážou data do grafikou. Jakékoli myšlenky na tomto plánu by také bylo velmi vítané.

Díky moc

Ed

Položena 06/07/2009 v 20:53
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
6

Podařilo se mi vyřešit tento problém a moje ReadOnlyCheckBox nápad, nakonec jsem vytvořil vlastní ovládací prvek založený kolem Button a potom aplikovat styl, aby to vypadalo jako políčko. Přidal jsem svou vlastní IsChecked vlastnost, že nedostane nastaven, když uživatel klepne, ale je vázán na data, takže zobrazí kontrola se objeví pouze tehdy, pokud změny dat.

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>

Odpovězeno 16/07/2009 v 08:24
zdroj uživatelem

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