创建样式时,是否可以将ControlTemplate属性设置为先前定义的资源?例如,如果我在ResourceDictionary中有以下内容:
<ControlTemplate x:Key="MyControlTemplate" TargetType="{x:Type Button}">
...
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
后来想在这样的样式中使用它:
<Style x:Key="MyStyle" TargetType="{x:Type Button}">
<Setter Property="Template" Value="???"/>
</Style>
Run Code Online (Sandbox Code Playgroud)
那可能吗?
我想把ScrollViewer放在它滚动的内容重叠/位于其上面的方式.我会设置ScrollViewer的不透明度,以便内容在下面可见.
据我所知,默认的ScrollViewer,这似乎不可能开箱即用,因为内容嵌套在ScrollViewer中.
关于如何使这项工作的任何想法?
编辑:我知道ScrollViewer是一个装饰器,内容不知道ScrollViewer.这种分离很好,我不希望内容知道ScrollViewer.我尝试做的是纯粹的视觉(布局)事物.只需在内容之上显示ScrollViewer.ScrollViewer的行为应保持不变.
我正在尝试在WPF中实现一个按钮,当您单击它时会显示一个菜单.我已经完成了所有工作,控件的ControlTemplate如下所示.(该控件扩展了ToggleButton).
<Border x:Name="Border" Padding="3" CornerRadius="1" BorderThickness="1"
VerticalAlignment="Stretch" HorizontalAlignment="Stretch" IsHitTestVisible="True">
Run Code Online (Sandbox Code Playgroud)
问题是,菜单仅在用户单击路径绘制的小箭头时显示.有什么方法可以使整个边界HitTestVisible?
我想制作一个看起来完全像按钮的CheckBox.我最初的微弱尝试根本不起作用.
<CheckBox x:Name="test">
Testing!
<CheckBox.Template>
<ControlTemplate>
<Button>
<ContentPresenter/>
</Button>
</ControlTemplate>
</CheckBox.Template>
</CheckBox>
Run Code Online (Sandbox Code Playgroud)
ContentPresenter不起作用(按钮为空),单击该按钮时,IsChecked属性不会切换.此外,当IsChecked为真时,我不知道如何使按钮看起来被推.
我已经为Button创建了自己的ControlTemplate,如下所示:
<Style x:Key="LightButtonStyle" TargetType="{x:Type ButtonBase}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ButtonBase}">
<Border
x:Name="WrappingBorder"
Margin="{TemplateBinding Margin}"
...
>
<ContentPresenter
Content="{TemplateBinding Content}"
...
>
</ContentPresenter>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Run Code Online (Sandbox Code Playgroud)
现在,我注意到当我将余量设置为我的按钮时,例如:
<Button
Style="{StaticResource LightButtonStyle}"
Margin="20"
>
Hello world!
</Button>
Run Code Online (Sandbox Code Playgroud)
按钮实际上是双边距-40.我认为控件实际上应该从不使用边距,并且在安排阶段只有按钮的祖先才能读取边距属性.我已经看了WPF的默认样式,并发现没有人使用过Margin.
这是正确的结论(保证金只能由集装箱正确安排)吗?换句话说,每次我在我的风格中使用{TemplateBinding Margin}时,我会获得双倍边距?是否有一些类似属性的列表,我的控件不应该使用(因为它们仅仅用于"周围世界")?
你能指点我的MSDN页面来解释这个吗?谢谢!
编辑:
我想我应该在http://msdn.microsoft.com/en-us/library/ms745058.aspx和http://msdn.microsoft.com/en-us/library/ms751709.aspx找到答案,但我不知道我们认为他们明确提到使用Margin属性永远不是控制者,它始终是评估它并使用它来影响布局的祖先或wpf系统......
有谁知道为什么我不能在控件模板上设置事件?
例如,以下代码行将无法编译.它通过控件模板中的任何事件执行此操作.
<ControlTemplate x:Key="DefaultTemplate" TargetType="ContentControl">
<StackPanel Loaded="StackPanel_Loaded">
</StackPanel>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)
我使用的是MVVM设计模式,此处的控件位于ResourceDictionary中,该ResourceDictionary被添加到应用程序的MergedDictionaries中.
首先,我使用的是Asp.Net MVC 4,并且我已经按照本教程修改了我的解决方案以包含CodeTemplates文件夹.(我认为我的问题可能与MVC有关吗?)

我已经用我自己的JQgrid模板替换了Ajax网格模板中的代码,这对于启动我的项目很好.但是我在创建全新的控制器模板时遇到了麻烦(让它们显示在创建新的控制器菜单中)

有任何想法吗?
更新
我在使用脚手架功能时采取了一些尝试,但这并不是我想到的(虽然它确实像预期的那样工作.我观看了史蒂夫桑德森关于这个主题非常有用的视频),任何获取方式我的自定义视图/控制器在添加控制器gui里面?
我有以下样式定义:
<!-- Border -->
<Style x:Key="MyControlBorder" TargetType="{x:Type Border}">
<Setter Property="BorderBrush" Value="DarkKhaki" />
<Setter Property="Background" Value="White" />
<Setter Property="BorderThickness" Value="1" />
<Setter Property="CornerRadius" Value="10" />
</Style>
<!-- TextBox -->
<Style x:Key="MyTextBox" TargetType="{x:Type TextBox}">
<Setter Property="Height" Value="30" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TextBoxBase}">
<Border Name="TextBoxBorder" Style="{StaticResource MyControlBorder}">
<ScrollViewer x:Name="PART_ContentHost"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<!-- PasswordBox -->
<Style x:Key="MyPasswordBox" TargetType="{x:Type PasswordBox}">
<Setter Property="Height" Value="30" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Control}">
<Border Name="Border" Style="{StaticResource MyControlBorder}">
<ScrollViewer x:Name="PART_ContentHost" />
</Border>
</ControlTemplate>
</Setter.Value> …Run Code Online (Sandbox Code Playgroud) 该TextBlock元素处理LineHeight得很好,允许文本完全显示,而不会剪切.但是,我想将其更改TextBox为便于编辑文本,这是我的麻烦开始的地方.
在TextBlock显示文字是这样的:
在TextBox显示文字是这样的:
我试图摆弄ClipToBounds和Clip属性,但它只在元素内剪辑,不会扩展到边界之外.
LineHeight需要将该属性设置为低以调节线之间的差距,因此不能进行更改.
我也尝试过Padding,但它只是这样做
如果这是唯一的解决方案,那我就会走开,聆听按键并相应地更改文本,但这似乎是很多工作,我不认为这是一个很好的解决方案,所以这是我的浓缩题:
如何使TextBox剪辑文本尽可能不像TextBlock它一样?
private static Style GetFontTextBlock()
{
var style = new Style();
style.Setters.Add(new Setter(TextBlock.LineStackingStrategyProperty, LineStackingStrategy.BlockLineHeight));
style.Setters.Add(new Setter(TextBlock.IsHyphenationEnabledProperty, true));
style.Setters.Add(new Setter(TextBlock.TextWrappingProperty, TextWrapping.Wrap));
style.Setters.Add(new Setter(Control.BorderBrushProperty, null));
return style;
}
public static Style GetHeadline()
{
// ApplyFont sets the Control.FontFamilyProperty to Geogrotesque Condensed Regular.
// It's a purchased font so I can't supply it, …Run Code Online (Sandbox Code Playgroud) 我通常在tab下的App.xml中定义样式和控件模板.因此,在设计UI时,我可以在带有.NET3.5的Visual Studio 2008中看到设计视图中应用了样式的UI.
但是,在另一种情况下,有时我只使用UserControl项目,在这种情况下,没有App.xml,因此UI在设计视图中显示为默认外观.在运行时很难知道实际的外观.
有没有办法将样式应用于UserControl?如果有一种方法可以在应用程序项目和UserControl项目之间共享相同的样式和模板,那将是完美的!
如果有解决方案,请告诉我.
controltemplate ×10
wpf ×9
styles ×3
xaml ×3
asp.net-mvc ×1
button ×1
c# ×1
checkbox ×1
layout ×1
margin ×1
passwordbox ×1
scrollbar ×1
scrollviewer ×1
styling ×1
t4 ×1
wpf-controls ×1