因此,在我的主应用程序ResourceDictionary中,我有一个以开头的样式
<Style TargetType="{x:Type TabItem}" x:Key="{x:Type TabItem}">
现在我正在做的是重写TabControl以生成一个自定义控件(没有ANY-xaml)。现在的问题是它没有继承自定义TabControl模板。
所以我想知道的是,考虑到它绑定到一个特定的控件,而我的控件没有xaml文件,我如何用程序绑定到模板的"x:Key"。
网上有些地方说要做这个
this.Style = (Style)FindResource("TabItem");
但这在我的情况下似乎不起作用。"样式"在一个单独的文件中,并导入到我的App.Xaml资源字典中。。。所以它正确地覆盖了所有的TabItems,但不是我覆盖的那个。
这是我的App.xaml
<Application x:Class="Octgn.OctgnApp" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/Resources/Themes/Full/ExpressionDark.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
</Application>
ExpressionDark.xaml 中的项目(由于太大而被略微截断)
<Style d:IsControlPart="True" TargetType="{x:Type TabItem}" x:Key="{x:Type TabItem}">
<Setter Property="Foreground" Value="{DynamicResource TextBrush}" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid x:Name="grid" Margin="2,1,2,3">
<Grid.LayoutTransform>
<TransformGroup>
<ScaleTransform ScaleX="1" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Grid.LayoutTransform>
<Border x:Name="border" BorderBrush="{x:Null}" CornerRadius="2,2,2,2" Opacity="0.5">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,0.976" StartPoint="0.5,0.039">
<GradientStop Color="#7F595959" Offset="0" />
<GradientStop Color="#19FFFFFF" Offset="1" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Border x:Name="SelectedBorder" BorderBrush="{x:Null}" CornerRadius="2,2,2,2" Opacity="0" Background="{DynamicResource SelectedBackgroundBrush}"/>
<Border x:Name="HoverBorder" BorderBrush="{x:Null}" CornerRadius="2,2,2,2" Opacity="0">
<Border.Background>
<LinearGradientBrush EndPoint="0.5,0.976" StartPoint="0.5,0.039">
<GradientStop Color="#7F595959" Offset="0" />
<GradientStop Color="#19FFFFFF" Offset="1" />
</LinearGradientBrush>
</Border.Background>
</Border>
<Grid>
<ContentPresenter x:Name="ContentSite" RecognizesAccessKey="True" ContentSource="Header" d:LayoutOverrides="Width, Height" HorizontalAlignment="Center" Margin="6,1,6,1" VerticalAlignment="Center" />
</Grid>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这个样式自动应用于TabItem,但我正在尝试将它应用于我对TabItem的覆盖。
这是的代码
/// <summary>
/// The chat bar item.
/// </summary>
public class ChatBarItem : TabItem
{
/// <summary>
/// Sets the Chat Room
/// </summary>
private readonly NewChatRoom room;
/// <summary>
/// Initializes static members of the <see cref="ChatBarItem"/> class.
/// </summary>
static ChatBarItem()
{
DefaultStyleKeyProperty.OverrideMetadata(
typeof(ChatBarItem), new FrameworkPropertyMetadata(typeof(TabItem)));
}
/// <summary>
/// Initializes a new instance of the <see cref="ChatBarItem"/> class.
/// </summary>
/// <param name="chatRoom">
/// The chat Room.
/// </param>
public ChatBarItem(NewChatRoom chatRoom)
{
this.room = chatRoom;
this.ConstructControl();
}
/// <summary>
/// Initializes a new instance of the <see cref="ChatBarItem"/> class.
/// </summary>
public ChatBarItem()
{
this.room = null;
this.ConstructControl();
}
/// <summary>
/// Constructs this control
/// </summary>
private void ConstructControl()
{
//this.Background = Brushes.Transparent;
//this.BorderThickness = new Thickness(0);
//this.Style = (Style)FindResource("TabItem");
// this is where I want to set the style of this control
// Main content object
var mainBorder = new Border { Margin = new Thickness(5) };
// Main content grid
var g = new Grid();
g.ColumnDefinitions.Add(new ColumnDefinition());
g.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(16) });
// Create item label
var label = new TextBlock() { VerticalAlignment = VerticalAlignment.Center };
if (this.IsInDesignMode() || this.room == null)
{
label.Inlines.Add(new Run("test"));
}
else
{
label.Inlines.Add(new Run(this.room.GroupUser.User.User));
}
// Create close button
var borderClose = new Border { Width = 16, Height = 16 };
var imageClose = new Image()
{
Source = new BitmapImage(new Uri("pack://application:,,,/Octgn;component/Resources/close.png")),
Stretch = Stretch.Uniform
};
// --Add items to items
// Add close image to closeBorder
borderClose.Child = imageClose;
// Add Close 'button' to grid
g.Children.Add(borderClose);
Grid.SetColumn(borderClose, 1);
// Add label to main grid
g.Children.Add(label);
// Add main grid to main border
mainBorder.Child = g;
// Add main grid to this
this.Header = mainBorder;
}
}
如果我有一个用于TabItem的xaml,我可以轻松地执行Style="{DynamicResource{x:Type TabItem}}"(或类似的操作),但我都是用程序完成的。
您已经尝试过:
<Style TargetType="{x:Type TabControl}" BasedOn="{StaticResource {x:Type TabControl}}">
</Style>
顺便说一句,如果您希望样式应用于所有TabControl,并且希望它适用于整个应用程序,则无需定义x:Key,请在App.xaml 中设置样式
编辑:我仍然不明白你到底想做什么。(如果可以,请再次编辑你的问题)。
但您可以尝试通过以下方式手动设置样式:
Style customStyle = (Style)Application.Current.FindResource("StyleKey");
如前所述,
static MyCustomTabControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomTabControl), new FrameworkPropertyMetadata(typeof(TabControl)));
}
但这只有在以下情况下才有效:
1) 控件的样式在文件中:Themes\Generic.xaml
2) 文件"Generic.xaml"的属性"BuildAction"的值为Page。
3) AssemblyInfo.cs包含:
[assembly: ThemeInfo (
ResourceDictionaryLocation.None,
ResourceDictionaryLocation.SourceAssembly
)]
在您的dervied选项卡Control 的静态构造函数中,这是怎么回事
static MyCustomTabControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(MyCustomTabControl), new FrameworkPropertyMetadata(typeof(TabControl)));
}
好吧,经过一番挖掘,在这里其他两个答案的帮助下,我终于找到了答案。看起来资源字典实际上是一个带有对象键的字典,而不是为FindResource创建字符串。所以…
this.Style = (Style)Application.Current.FindResource(typeof(TabItem));
对我来说就是这样。
再次感谢另外两个答案。