- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我是 WPF 的新手,我的包含自定义按钮的用户控件有点问题。
一切正常,直到我尝试将自定义按钮的内容绑定(bind)到用户控件内容。
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:OP"
mc:Ignorable="d"
x:Class="OP.GamepadButton"
x:Name="GamePadBtn"
d:DesignWidth="100" d:DesignHeight="100">
<UserControl.Resources>
<Style x:Key="GamepadButtonStyle" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid>
<Rectangle x:Name="rectangle" Fill="{TemplateBinding Background}" StrokeThickness="1" Opacity="0.8" Stroke="{TemplateBinding BorderBrush}"/>
<ContentPresenter Content="{TemplateBinding Content}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsFocused" Value="True"/>
<Trigger Property="IsDefaulted" Value="True"/>
<Trigger Property="IsMouseOver" Value="True"/>
<Trigger Property="IsPressed" Value="True"/>
<Trigger Property="IsEnabled" Value="False"/>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition/>
</Grid.RowDefinitions>
<Button Content="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GamepadButton}}, Path=Content}"
Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GamepadButton}}, Path=Background}"
BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GamepadButton}}, Path=BorderBrush}"
Grid.Row="1" Style="{DynamicResource GamepadButtonStyle}" />
</Grid>
然后我在主窗口中声明用户控件的方式如下:
<local:GamepadButton Height="60" Width="60" Background="#DAF0FC" BorderBrush="#2c3e50" Content="Button"/>
结果如下:
另外,我现在注意到,出于某种原因,这也会破坏 BorderBrush 绑定(bind),但不会破坏 Background 绑定(bind)。
如果我不为 Usercontrol 声明任何内容属性并直接设置按钮内容,代码就可以工作:
<Button Content="Button"
Background="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GamepadButton}}, Path=Background}"
BorderBrush="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:GamepadButton}}, Path=BorderBrush}"
Grid.Row="1" Style="{DynamicResource GamepadButtonStyle}" />
<local:GamepadButton Height="60" Width="60" Background="#DAF0FC" BorderBrush="#2c3e50" />
这给了我想要的按钮样式:
所以我的问题是。
如何使按钮的 ContentPresenter 绑定(bind)到为用户控件声明的内容?
最佳答案
您面临的问题是您无法从内容内部绑定(bind)到内容。您在用户控件中的按钮是控件的当前内容。在您的输出窗口中,您会看到这一行
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='OP.GamepadButton', AncestorLevel='1''. BindingExpression:Path=Tag; DataItem=null; target element is 'Button' (Name=''); target property is 'Content' (type 'Object')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='OP.GamepadButton', AncestorLevel='1''. BindingExpression:Path=Background; DataItem=null; target element is 'Button' (Name=''); target property is 'Background' (type 'Brush')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='OP.GamepadButton', AncestorLevel='1''. BindingExpression:Path=BorderBrush; DataItem=null; target element is 'Button' (Name=''); target property is 'BorderBrush' (type 'Brush')
如果您将其更改为其他属性,例如 Tag,那么您的样式将正确应用。
我认为你可以只使用样式来解决你的任务,但如果你真的需要新的 UserControl 那么你可以直接从按钮而不是 UserControl 继承它。
关于c# - WPF - ContentPresenter 不绑定(bind)到 UserControl 内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28917946/
我刚刚开始使用样式和控件模板,并创建了以下样式来将按钮显示为网格中的文本。我想将字体样式嵌入到下划线样式中,但还没有弄清楚。
我有一个 DataTemplate : ... 我想用它作为 ContentTemplate的 ContentPresenter : 如何使用预定
我正在尝试为我的 ItemsControl 使用单选模式。所以我将 ItemsControl 更改为 ListBox 但是出现异常 "A style intended for type 'Conten
基本上,我不了解这里的真正区别是: TabItem的Microsoft代码使用: 那么,什么时候可以使用Content属性代替(或补充使用)ContentSource? 最佳答案 此属性仅在以下情况
我遇到了 ContentPresenter 根据样式是否位于窗口中而表现异常的问题。资源或资源字典中。具体来说,我将默认 TextBlock 的前景设置为黑色,然后将默认按钮样式中的前景值设置为白色。
我在 ControlTemplate 中有一个 ContentPresenter,试图布局一个 TabItem。我希望标题内 TextBlock 的前景色在选择选项卡时更改颜色。我的模板如下:
我在 Themes\Generic.xaml 下有下面的代码 现在我需要在代码中获取 cPresenter 我该怎么做? 事实上,我尝试将 Silverlight 实现转换为 WPF 代码。我想使用类
我只是在玩一个简单的 ContentPresenter。
我的 View 中有一个 ContentControl,它数据绑定(bind)到我的 View 模型的 CurrentItem 属性。通过 CurrentItem 公开的对象每个都有自己的 DataT
我覆盖了 wpf 扩展器的模板。 header 有 ContentPresenter 我试图为里面的所有 TextBlocks 添加我的样式。 如果我将标题
好的,我在网格单元中有一个 contentpresenter:
我已经覆盖了 ComboBox为了在组合的末尾添加一个额外的按钮 - 我正在使用它来帮助浏览我的应用程序。 它是一个 M-V-VM 应用程序,具有编辑-保存/取消机制,可根据用户是否处于“编辑模式”来
是否可以定义 ContentPresenter 的“呈现行为”?以便将填充应用于其内容? 现在我有一个 ContentPresenter并定义所有 UserControl 的边距可以成为此 Conte
我正在尝试基于数据触发器切换 contentpresenter 的内容。我想在 contentpresenter.content 中显示用户控件,如果我设置了值,否则我需要显示错误消息。但是绑定(bi
我正在使用以下产品:VS 2010、.Net 4、WPF 和 .Net Memory Profiler 版本 4.6.40.0 Pro。它们都在 Win7 64 位上运行。我一直在使用 .Net Me
我有以下 xaml:
我有 2 个 ContentPresenter fixedContentPresenter 和 resizableContentPresenter 并且显然是 Generic.xaml 中的内容。当
我正在使用 ItemsControl 生成基于我的模型的控件列表。查看可视化树时,我注意到每个呈现的控件都包装在一个 ContentPresenter 中。添加的控件是第 3 方控件,旨在显示每个控件
我有一个 ListBox,它绑定(bind)到动态创建的 UserControls 的 ObesvableCollection。 .
例如: 然后,PopUpView 中的 View 将在中间有一个边框,其中包含要显示的消息和一个半透明的背景,使
我是一名优秀的程序员,十分优秀!