小编mg0*_*007的帖子

如何将TemplateBind绑定到BorderThickness.Top(或Bottom或Left或Right)?

我想知道是否可以将像BorderThickness.Top这样的结构元素绑定到TemplatedParent的相应属性.我试过了

<Border Margin="0" Padding="{TemplateBinding Padding}" BorderBrush="{TemplateBinding BorderBrush}">
    <Border.BorderThickness>
        <Thickness Left="0" Right="0" Top="{TemplateBinding BorderThickness.Top}" Bottom="{TemplateBinding BorderThickness.Bottom}"/>
    </Border.BorderThickness>
</Border>
Run Code Online (Sandbox Code Playgroud)

我想要这样做的原因是我希望左和右为0并且只有顶部和底部被绑定.

提前致谢.

wpf binding thickness templatebinding

9
推荐指数
1
解决办法
5148
查看次数

如何在运行时动态更改MultiBinding(或任何其他)资源的ConverterParameter(或任何)属性?

我是wpf和xaml的新手.我通过在这里搜索或搜索谷歌来找到大多数问题(在其他语言中)的解决方案,但这一个让我发疯.我在谷歌搜索了很多并浏览了很多论坛,但似乎这次我遇到了一个真正的挑战!

我在Window.Resources中有以下代码:

<my:NameConverter x:Key="NameConverter"/>

<MultiBinding x:Key="CustomerFullNameBinding" 
              Converter="{StaticResource NameConverter}"
              ConverterParameter="LastNameFirst">
     <Binding Path="FirstName"  />
     <Binding Path="MiddleName" />
     <Binding Path="LastName" />
</MultiBinding>
Run Code Online (Sandbox Code Playgroud)

NameConverter类组合名称的各个部分返回全名.返回值基于ConverterParameter的值,该值可以是以下之一:FirstNameFirst,LastNameFirst,OnlyFirstName,OnlyLastName,Initials(还有一些;但为简单起见,我们不考虑它们)

这段代码工作正常.我用以下来得到结果:

<TextBlock Text="{DynamicResource CustomerFullNameBinding}"/>
Run Code Online (Sandbox Code Playgroud)

但是,问题是如果我在我的代码中使用资源CustomerFullNameBinding 20次(如所示abovw),所有这些都将以一种特定格式显示名称.(即在CustomerFullNameBinding的声明中,我设置了ConverterParameter ="LastNameFirst",所以所有20个引用都只会以这种方式显示名称.)

现在我的问题是我可以使它更"通用",以便我可以动态设置ConverterParameter的值吗?即我可以有多个文本块,可以显示不同格式的全名.我知道如果我们创建多个资源是可能的,如下所示:

 <MultiBinding x:Key="CustomerFullNameBinding_FirstNameFirst" 
               Converter="..." ConverterParameter="FirstNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_LastNameFirst" 
               Converter="..." ConverterParameter="LastNameFirst">
      ......
 </MultiBinding>
 <MultiBinding x:Key="CustomerFullNameBinding_OnlyFirstName" 
               Converter="..." ConverterParameter="OnlyFirstName">
      ......
 </MultiBinding>

 ... and so on ...
Run Code Online (Sandbox Code Playgroud)

但我不想这样,'因为它真的会让我的代码太笨重,最重要的是它会使资源的可重用性概念无效!

请建议我任何可能的解决方案.
提前致谢.

注意:我从这里得到了最初的想法.类似的工作示例可以在msdn.microsoft.com/en-us/library/ms771336.aspx找到.

标签:wpf xaml staticresource dynamicresource binding

.net wpf xaml binding converter

5
推荐指数
1
解决办法
6336
查看次数

(WPF) 如何从 ResourceDictionary 将 sys:Double 的值设置为 SystemFonts.MessageFontSize?

设想:

我想用3个标准字体大小为我的WPF应用程序:BigFontSizeNormalFontSize,和SmallFontSize。这些是双值,它们在资源字典中定义为(sys适当定义的地方):

<sys:Double x:Key="BigFontSize">18</sys:Double>
<sys:Double x:Key="NormalFontSize">14</sys:Double>
<sys:Double x:Key="SmallFontSize">12</sys:Double>
Run Code Online (Sandbox Code Playgroud)

这很好用。但是我随机选择了 14 个作为正常尺寸。我想要的是获得系统定义的字体大小NormalFontSize。(如果这样做了,我可以使用此处描述的转换器来获取BigFontSizeSmallFontSize相对于NormalFontSize


线索:

我从文档中发现默认字体大小存储在静态属性 (double) 中SystemFonts.MessageFontSize。但是我应该怎么做才能将该值检索到资源字典中?(我知道BindingDynamicResource不能适用。但是,嘿,这是一个静态值,所以我怎么能申请StaticResourcex:Static或什么?)

我试过了

<sys:Double x:Key="XXXFontSize">
    <StaticResource ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Run Code Online (Sandbox Code Playgroud)

<sys:Double x:Key="XXXFontSize">
    <x:Static ResourceKey="SystemFonts.MessageFontSize" />
</sys:Double>
Run Code Online (Sandbox Code Playgroud)

两者似乎都不起作用(如预期)。我收到一条错误消息Cannot add content to object of type 'System.Double'.

笔记:

  • 我不想从代码中执行此操作,例如从 App() 中执行此操作。(是否可以为 ResourceDictionary 设置代码隐藏?)
  • 我不想将其封装在可以从中派生出其他样式的通用样式中(使用BasedOn),因为我有多个资源字典,并且无法使用DynamicResourcewithBasedOn
    也就是说,我不能使用 …

wpf font-size resourcedictionary dynamicresource

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