结合自定义依赖属性自定义样式WPF [英] Binding custom dependency property to custom WPF style

查看:503
本文介绍了结合自定义依赖属性自定义样式WPF的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在设计继承扩展时,我有一个问题。我的目的是在默认的扩展头中的切换按钮和文本背后的进度条。

I have an issue when designing a inherited Expander. My intention is to have a progress bar behind the toggle button and text in the default Expander header.

我有这样的XAML代码,这让我在标题中的进度条。它是一个自定义样式

I have this XAML code which gives me the progress bar in the header. It is a custom style.

<Style x:Key="CurrentScanExpanderStyle" TargetType="{x:Type local:ProgressExpander}">
    	<Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.ControlTextBrushKey}}"/>
    	<Setter Property="Background" Value="Transparent"/>
    	<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
    	<Setter Property="VerticalContentAlignment" Value="Stretch"/>
    	<Setter Property="BorderBrush" Value="Transparent"/>
        <Setter Property="BorderThickness" Value="1"/>
    	<Setter Property="Template">
    		<Setter.Value>
    			<ControlTemplate TargetType="{x:Type local:ProgressExpander}">
    				<Border SnapsToDevicePixels="true" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" CornerRadius="3">
    					<DockPanel>
                            <Grid DockPanel.Dock="Top">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>
                                <ProgressBar Name="ProgressBar"/>
                                <ToggleButton FontFamily="{TemplateBinding FontFamily}" FontSize="{TemplateBinding FontSize}" FontStretch="{TemplateBinding FontStretch}" FontStyle="{TemplateBinding FontStyle}" FontWeight="{TemplateBinding FontWeight}" Foreground="{TemplateBinding Foreground}" HorizontalContentAlignment="{TemplateBinding HorizontalContentAlignment}" Padding="{TemplateBinding Padding}" VerticalContentAlignment="{TemplateBinding VerticalContentAlignment}" FocusVisualStyle="{StaticResource ExpanderHeaderFocusVisual}" Margin="1" MinHeight="0" MinWidth="0" x:Name="HeaderSite" Style="{StaticResource ExpanderDownHeaderStyle}" IsChecked="{Binding Path=IsExpanded, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Content="{TemplateBinding Header}" ContentTemplate="{TemplateBinding HeaderTemplate}" ContentTemplateSelector="{TemplateBinding HeaderTemplateSelector}"/>
                            </Grid>
    						<ContentPresenter Focusable="false" Visibility="Collapsed" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" x:Name="ExpandSite" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" DockPanel.Dock="Bottom"/>
                        </DockPanel>
    				</Border>
    				<ControlTemplate.Triggers>
    					<!-- Triggers haven't changed from the default -->
    				</ControlTemplate.Triggers>
    			</ControlTemplate>
    		</Setter.Value>
    	</Setter>
    </Style>

这工作正常,但我有麻烦的结合,控制进度百分比我的自定义依赖项属性。

this works fine but I am having trouble binding my custom dependency property which controls the progress percentage.

    public class ProgressExpander : Expander
{
    static ProgressExpander()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(ProgressExpander), new FrameworkPropertyMetadata(typeof(ProgressExpander)));
    }       



    public int Progress
    {
        get { return (int)GetValue(ProgressProperty); }
        set { SetValue(ProgressProperty, value); }
    }

    // Using a DependencyProperty as the backing store for Progress.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ProgressProperty =
        DependencyProperty.Register("Progress", typeof(int), typeof(ProgressExpander), new UIPropertyMetadata(0));


}

这是窗口中的代码

            <local:ProgressExpander Grid.Row="1" Header="Current Scan" ExpandDirection="Down" x:Name="currentScanExpander" Style="{DynamicResource CurrentScanExpanderStyle}">
                <Canvas Background="SkyBlue" 
                        Name="currentScanCanvas"
                        Height="{Binding ElementName=currentScanExpander, Path=ActualWidth}"
                        />
            </local:ProgressExpander>



我不知道如何将这种依赖属性绑定进度内中进度的进度值风格。

I'm not sure how to bind this dependency property progress to the progress value in the ProgressBar within the style.

任何帮助,将不胜感激。

Any help would be appreciated.

推荐答案

在样式,我们可以用一个标准用的RelativeSource成立属性绑定

In the style, we can use a standard Binding with a RelativeSource to set up the property.

<ProgressBar Name="ProgressBar"
			 Value="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Progress}"
			 Minimum="0"
			 Maximum="100" />



然后,在窗口中,我们只需添加进展=50或绑定到其他地方。

Then, in the window we just add Progress="50" or a binding to somewhere else.

您还需要将按钮的背景设置为透明,或更改布局的某种方式,才能看到它。

You will also need to set the Button's background to transparent, or change some manner of the layout, in order to see it.

这篇关于结合自定义依赖属性自定义样式WPF的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆