Привет, я думаю, что это вопросы для начинающих. Я искал все связанные вопросы. Но на все они ответили .xaml. Однако мне нужен обратный код. У меня есть TabControl. Мне нужно установить цвет фона его элементов. Мне нужно установить разные цвета для элементов, когда они выбраны, не выбраны и наведите курсор. Большое вам спасибо за помощь. Я хочу разместить здесь свои коды. Однако в настоящее время все, что у меня есть, это экземпляр TabControl и одно свойство под названием ActiveTabIndex.WPF TabControl, измените цвет фона TabItem на коды C#
--------------------------------------- Редактировать 1 ----- ------------------------------------------
Я добавил событие SelectionChanged
(this.myTabControl as System.Windows.Controls.TabControl) .SelectionChanged + = TabSet_SelectionChanged;
void TabSet_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
foreach (System.Windows.Controls.TabItem item in (this.myTabControl as System.Windows.Controls.TabControl).Items)
{
if (item == (this.myTabControl as System.Windows.Controls.TabControl).SelectedItem)
{
item.Background = System.Windows.Media.Brushes.Red;
}
else
item.Background = System.Windows.Media.Brushes.Green;
}
}
Однако на самом деле я могу установить Зеленый. Цвет фона выбранного элемента сохраняется как цвет по умолчанию, а не красный. Любые намеки на это? Кроме того, я хотел бы знать, как добавить событие для зависания. Не нашли точное событие. Еще раз спасибо.
----------------------- Редактировать 2 ---------------------- ---------
После долгого долгого обсуждения. Я решил (фактически не мое решение) использовать XAML. Да. Я новичок в WPF. Поэтому у меня все еще есть вопросы об этом (мне очень жаль это, пожалуйста, возьми меня). Вопросы здесь: Я хотел бы изменить цвет фона на оранжевый, когда мышь находится над TabItem. Теперь цвет оранжевый, когда мышь находится над ContentPanel и TabItem. Мне нужно, чтобы он был оранжевым, когда мышь находится над TabItem. (Я не уверен, что я достаточно ясен.) Другой вопрос в том, что я хотел бы, чтобы пользователи устанавливали цвет вместо того, чтобы устанавливать его прямо на красный. Думаю, мне нужны привязки. По этому вопросу я буду уверен позже. Просто хочу быть ясным. Большое вам спасибо за всех вас. Действительно полезно.
<TabItem x:Class="MyControls.Tab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<TabItem.Style>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid>
<Border Name="Border" Margin="0,0,-4,0" BorderThickness="1,1,1,1" CornerRadius="2,12,0,0" >
<ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="12,2,12,2" RecognizesAccessKey="True"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="100" />
<Setter TargetName="Border" Property="Background" Value="Red" />
<Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Green" />
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="Orange" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabItem.Style>
</TabItem>
------------- Edit 3 ----------------
Я не достаточно ясно, я думаю. Вот что теперь: Это работает хорошо, если мышь находится над другими вкладками:
Но когда мышь находится над кружком области, цвет фона выбранного элемента должен быть красным, а не оранжевый:
--------------- Редактировать 4 -------------------
Спасибо за все вы за свой ответ. Теперь, после продолжительной дискуссии с моими пользователями и некоторыми другими, мы хотели бы динамически менять фоновый цвет. Пользователь хочет установить цвет самостоятельно. В принципе, мне нужно сначала сделать привязку (если это термин). Я пробовал следующее. Однако выбранная вкладка не с красным фоном. Я использовал Snoop для проверки, оказалось, что Background задан как красный локально. Я немного запутался здесь. Я спросил, и кто-то дал мне предложение использовать TemplateBinding, поскольку он находится под ControlTemplate. Но я попытался создать свойство зависимостей и что-то в этом роде.Но просто я не понимаю, почему я должен использовать TemplateBinding, так как я прочитал в какой-то статье, что он предназначен для привязки времени компиляции. Я совершенно смущен. Я новичок в WPF, извините, если вопрос является вопросом низкого уровня. Еще раз спасибо!
<TabItem x:Class="MyControl.Tab"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<TabItem.Style>
<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid>
<Border Name="Border" Margin="0,0,-4,0" BorderThickness="1,1,1,1" CornerRadius="2,12,0,0" >
<ContentPresenter x:Name="ContentSite" VerticalAlignment="Center" HorizontalAlignment="Center" ContentSource="Header" Margin="12,2,12,2" RecognizesAccessKey="True"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Panel.ZIndex" Value="100" />
<Setter TargetName="Border" Property="Background" Value="{Binding SelectedBgClr}" />
<Setter Property="Foreground" Value="Yellow" />
<Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0" />
</Trigger>
<Trigger Property="IsSelected" Value="False">
<Setter TargetName="Border" Property="Background" Value="Green" />
<Setter Property="Foreground" Value="AliceBlue"/>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Border" Property="Background" Value="Orange" />
<Setter Property="Foreground" Value="Black"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</TabItem.Style>
</TabItem>
Код за это:
public Tab()
{
SelectedBgClr = new SolidColorBrush(Colors.Red);
//UnSelectedBgClr = new SolidColorBrush(Colors.Green);
//HoverBgClr = new SolidColorBrush(Colors.Orange);
InitializeComponent();
}
public static readonly DependencyProperty SelectedBgClrProperty = DependencyProperty.Register("SelectedBgClr", typeof(Brush), typeof(Tab), new UIPropertyMetadata(null));
public Brush SelectedBgClr
{
get
{
return (Brush)GetValue(SelectedBgClrProperty);
}
set
{
SetValue(SelectedBgClrProperty, value);
}
}
Очевидно, что на все ответы на ваш вопрос отвечает XAML, потому что ** Это то, что XAML для ** –
HighCore является правильным - выбранный/невыбранный/зависание задается определениями визуального состояния в шаблоне управления. См. Здесь: http://msdn.microsoft.com/en-us/library/ms754137(v=vs.110).aspx – McGarnagle
Спасибо @HighCore !! Понимаю. Однако это проект моего проекта. Нет XAML ... (мне лично тоже не нравится дизайн). Я работаю над этим. Надеюсь получить что-то позже. Во всяком случае, XAML должен быть скомпилирован для кодов. – Payson