标签: controltemplate

如何使用 WPF 触发器和动画将颜色动画重置为动画之前的颜色

我有一个带有触发器部分的文本框的控件模板,如下所示

<ControlTemplate.Triggers>
    <EventTrigger  RoutedEvent="Binding.TargetUpdated">
        <BeginStoryboard>
            <Storyboard>
                <ColorAnimationUsingKeyFrames 
                    Storyboard.TargetName="Border"
                    Storyboard.TargetProperty="Background.(SolidColorBrush.Color)">
                    <EasingColorKeyFrame KeyTime="0:0:0.20" Value="Yellow"/>
                    <EasingColorKeyFrame KeyTime="0:0:1" Value="{Binding ElementName=Border, Path=Background.SolidColorBrush.Color}"/>
                </ColorAnimationUsingKeyFrames>
            </Storyboard>
        </BeginStoryboard>
    </EventTrigger>
</ControlTemplate.Triggers>
Run Code Online (Sandbox Code Playgroud)

这个想法是,每当绑定目标更新时,文本框就会发出黄色脉冲。我的用户界面在控件之间具有复杂的依赖关系,我希望当事情发生变化时通过简单的视觉提示通知用户。

我上面遇到的问题是将文本框的背景颜色重置为之前的颜色。如果我将其动画恢复为白色,这可能不是原始颜色。有几种视觉状态,即normal disabled enabled

所以我希望脉冲黄色,然后恢复到之前的颜色。但是,如果我尝试绑定最终关键帧的颜色,则会收到类似错误

Cannot freeze storyboard to be used across multiple threads.
Run Code Online (Sandbox Code Playgroud)

有没有办法在动画完成后自动清除动画结果或动态绑定正确的颜色?

wpf triggers controltemplate

4
推荐指数
1
解决办法
1748
查看次数

如何更改 WPF 复选框勾号的颜色?

我想将 WPF 中的勾号颜色CheckBox从黑色更改为白色。我尝试在CheckBox声明中这样做:

<CheckBox Background="black" Foreground="White" BorderBrush="#262626"/>
Run Code Online (Sandbox Code Playgroud)

背景和边框成功更改,但刻度线本身没有更改。

c# wpf xaml controltemplate

4
推荐指数
1
解决办法
6150
查看次数

将参数传递给模板

假设我已经定义了一个带圆角的按钮.

<Style x:Key="RoundButton" TargetType="Button">
    <!-- bla bla -->
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border CornerRadius="0,5,5,0" />
                <!-- bla bla -->
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

我可能这个按钮的用户可以指定CornerRadius吗?我可以使用TemplateBinding吗?但是我应该在哪里绑定?(标记?)

.net c# wpf xaml controltemplate

3
推荐指数
2
解决办法
1816
查看次数

wpf中控制模板和数据模板之间的区别

有人可以详细说明ControlTemplateDataTemplatewpf 之间的区别吗?

在自定义控件的情况下应该使用什么?比如一个StackPanel可能有一个image和一个TextBox

在某些使用"Content"属性定义自定义控件的情况下,这似乎令人困惑.

如果能够提供如何在不同场景中使用每个场景的示例,那将是很好的.

wpf datatemplate controltemplate

3
推荐指数
1
解决办法
3118
查看次数

附加行为绑定到controltemplate中的元素

我正在向滑块添加附加行为,这会导致在拖动拇指并将其保持在特定区域时滚动某些内容.(不能使用简单的IsMouseOver触发器,因为Slider Thumb具有MouseCapture.)

该行为有3个属性:

    #region IsScrollHoverProperty
    public static readonly DependencyProperty IsScrollHoverProperty = DependencyProperty.RegisterAttached(
                                                "IsScrollHover",
                                                typeof(Boolean),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(false));
    #endregion

    #region ScrollLeftRectProperty
    public static readonly DependencyProperty ScrollLeftRectProperty = DependencyProperty.RegisterAttached(
                                                "ScrollLeftRect",
                                                typeof(Rectangle),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(null));
    #endregion

    #region ScrollRightRectProperty
    public static readonly DependencyProperty ScrollRightRectProperty = DependencyProperty.RegisterAttached(
                                                "ScrollRightRect",
                                                typeof(Rectangle),
                                                typeof(ScrollHoverAreaBehaviour),
                                                new UIPropertyMetadata(null));
    #endregion
Run Code Online (Sandbox Code Playgroud)

当用户拖动滑块时,IsScrollHoverProperty被设置为true,这一切都在Slider的ControlTemplates.Triggers中完成,并且可以正常工作.

当它设置为true时,回调将把PreviewMouseEnterHandlers挂钩到两个Rectangle中以检测鼠标何时进入它们.

有问题的矩形也在Slider的controltemplate中定义:

        <StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Left" Orientation="Horizontal">
            <Rectangle  Width="40" Fill="#AAAAAAAA" Name="ScrollLeftRect"/>

            </StackPanel>
        <StackPanel Grid.Row="0" Grid.RowSpan="3" HorizontalAlignment="Right" Orientation="Horizontal">
            <Rectangle  Width="40" Fill="#AAAAAAAA" Name="ScrollRightRect"/>
         </StackPanel>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是将这些矩形绑定到附加的ScrollRightRect和ScrollLeftRect属性.我尝试了一些事情,并怀疑我犯了一个愚蠢的绑定错误,或者我试图做一些不允许的事情.我目前正在controltemplate.triggers中绑定它们,如下所示:

        <Trigger Property="local:ScrollHoverAreaBehaviour.IsScrollHover" Value="False">

            <Setter Property="local:ScrollHoverAreaBehaviour.ScrollLeftRect" Value="{Binding ElementName=ScrollLeftRect}"/>
            <Setter …
Run Code Online (Sandbox Code Playgroud)

wpf binding controltemplate attachedbehaviors

3
推荐指数
1
解决办法
4697
查看次数

ToggleButton悬停并单击行为

我为ToggleButton创建了一个ContentTemplate和Style,它看起来就像你从微软的WebMatrix那里知道的那样.

但是,并不总是可以单击,也不会显示悬停效果.我发现当我将鼠标悬停在图标或按钮文本上时,会出现点击/悬停区域.

悬停并单击不起作用

悬停并单击工作

一旦盘旋,可以用鼠标回到右边,悬停不会消失(应该如此).

这是代码的重要部分:

            <StackPanel.Resources>
                <Style TargetType="{x:Type ToggleButton}" BasedOn="{StaticResource NavigationButton}" />
            </StackPanel.Resources>
            <ToggleButton x:Name="_btn_Buchungen" Click="_btn_Buchungen_Click">
                <StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                    <Image Source="{StaticResource Buchungen}" Width="16" Height="16" />
                    <TextBlock Text="Buchungen" />
                </StackPanel>
            </ToggleButton>
Run Code Online (Sandbox Code Playgroud)

ControlTemplate和样式:

<Style TargetType="{x:Type ToggleButton}" x:Key="NavigationButton">
            <Setter Property="Background" Value="{x:Null}" />
            <Setter Property="Height" Value="35" />
            <Setter Property="BorderBrush" Value="{x:Null}" />
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                        <Border Name="OuterBorder" BorderThickness="0,1,0,0" >
                            <Border Name="InnerBorder" BorderThickness="0,1,0,1" >
                                <ContentPresenter HorizontalAlignment="Left" VerticalAlignment="Center"/>
                            </Border>
                        </Border>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" Value="true">
                                <Setter Property="Style" TargetName="InnerBorder" Value="{StaticResource ButtonInnerBHover}" /> …
Run Code Online (Sandbox Code Playgroud)

wpf xaml controls styles controltemplate

3
推荐指数
1
解决办法
6883
查看次数

用于Windows 8 Metro-UI的控件样式和模板

我遇到了一些关于我的C#/ XAML Metro-UI应用程序的视觉外观的问题.我想自定义默认模板.对于其他类型的应用程序,我可以从MSDN文章中获取默认样式和控件.例如:

在哪里可以找到类似于Metro-UI默认样式和模板的内容?

我知道可以在Expression Blend中提取模板或样式.但是我在下一个帖子中描述了我的Blend for Visual Studio 11的问题.

c# controltemplate microsoft-metro windows-8

3
推荐指数
1
解决办法
2186
查看次数

绑定到应用样式/模板的Control

我想(重新)模板控件,例如ComboBox.

XAML:

<ComboBox Style="{StaticResource MyComboBoxStyle}" ... >
    <!-- ... -->
</ComboBox>
Run Code Online (Sandbox Code Playgroud)

在ControlTemplate中我想要一个Button.

ResourceDictionary中:

<Style x:Key="MyComboBoxStyle" TargetType="{x:Type ComboBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ComboBox}">
                <Grid>
                    <!-- ... -->

                    <Button Command="{TemplateBinding Tag}" CommandParameter="{Binding ???}" />

                    <!-- ... -->
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)

但我想设置CommandParameter应用模板的Control(在本例中为ComboBox).

我怎么解决这个问题?

wpf xaml binding controltemplate commandparameter

3
推荐指数
1
解决办法
2210
查看次数

如何应用TextBox控件模板?

我正在尝试简化一些代码并提高可维护性.

我最初正在寻找一种方法,让文本框与左边对齐,可以缩小并扩展到最大值,而不会在达到最大值后在网格单元内居中.

所以我开始写这样的代码......

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="150" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

(代码清单1)

这会产生类似这样的东西......

网格居中的TextBox

(图1)

如您所见,这将TextBox的最大宽度居中,但它在网格单元的中心对齐.

那么我可能,如果我改变了文本框的水平对齐方式,那么...

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <TextBox  Text="Some text"
              VerticalAlignment="Center"
              HorizontalAlignment="Left"
              Margin="10"
              MaxWidth="100" />
</Grid>
Run Code Online (Sandbox Code Playgroud)

(代码清单2)

但不幸的是,这只会产生这样的东西......

太小的TextBox左对齐

(图2)

同样,这是不正确的,因为尽管右侧有所有空白区域,但文本框并没有像我想要的那样扩展到其最大宽度100.

最后,我发现如果将TextBox放在嵌套网格中,您将获得所需的效果.

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="200" />
    </Grid.ColumnDefinitions>
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="1*"
                              MaxWidth="120" />
            <ColumnDefinition Width="0*" />
        </Grid.ColumnDefinitions>
        <TextBox Text="Some text"
             VerticalAlignment="Center"
             HorizontalAlignment="Stretch"
             Margin="10"
             MaxWidth="100" />
    </Grid>
</Grid>
Run Code Online (Sandbox Code Playgroud)

(代码3)

这产生了这个......

正确看TextBox

(图3)

如您所见,嵌套网格填充整个200宽的空间,但文本框填充左侧100,并留下右侧的空白区域.(如果此窗口具有可调整大小,则会缩小并适当扩展)

我想将代码清单3的方法应用于样式或控件模板,因此我可以将其应用于适用于此情况的TextBoxes.

在一个完美的场景中,我会做...

<TextBox Text="Some text" …
Run Code Online (Sandbox Code Playgroud)

c# wpf xaml .net-4.0 controltemplate

3
推荐指数
2
解决办法
1万
查看次数

如何更改Combobox WPF的CornerRadius

我想用一个ComboBox不同的CornerRadius,我怎么能简单地改变它?我试着StyleControlTemplate,但没有成功.

wpf combobox styles cornerradius controltemplate

3
推荐指数
2
解决办法
9975
查看次数