我的MainWindow中有一个tabControl,还有一个正在运行的LeftWindowCommand
<Controls:MetroWindow.LeftWindowCommands>
<Controls:WindowCommands >
<Button x:FieldModifier="public" x:Name="btnOpenBanMenu" Click="btnOpenBanMenu_Click">
<StackPanel Orientation="Horizontal">
<Rectangle Width="20"
Height="20"
Fill="{Binding Foreground, RelativeSource={RelativeSource AncestorType={x:Type Button}}}">
<Rectangle.OpacityMask>
<VisualBrush Stretch="Fill" Visual="{StaticResource bans}" />
</Rectangle.OpacityMask>
</Rectangle>
<TextBlock Margin="4 0 0 0"
VerticalAlignment="Center"
Text="Bans"/>
</StackPanel>
</Button>
</Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>
一切都很好。 但是现在我想使用LeftWindowCommand作为“子菜单栏”,所以如果你改变选中的Tab,LeftWindowCommands-Bar也应该改变那些项目和按钮背后的动作。 我已经玩过可见性,但这不是我想要的。
为了更好地理解:
你会看到“Giveaway,Losung,Songrequest”这些项目。 这些项目在我的TabControl中。
现在我想更改“子菜单” - 项目(如图所示),当我选择不同的标签然后赠品。
有人可以指导我,怎么做?
EDIT2:最后它适用于MVVM,但我仍然不知道如何绑定LeftWindowCommands。
MainModel:
class MainModel
{
public string Header { get; set; }
public MahApps.Metro.Controls.MetroContentControl Content { get; set; }
public MahApps.Metro.Controls.WindowCommands LeftWindowCommands { get; set; }
}
MainViewModel:
class MainViewModel : BaseViewModel
{
private ObservableCollection<Model.MainModel> _tabItems;
public ObservableCollection<Model.MainModel> tabItems
{
get { return _tabItems; }
set
{
_tabItems = value;
OnPropertyChanged("tabItems");
}
}
public MainViewModel()
{
_tabItems = new ObservableCollection<Model.MainModel>()
{
new Model.MainModel
{
Header = "Giveaway",
Content = new Controls.ucGiveaway(),
LeftWindowCommands = LeftWindowCommandsGiveaway()
},
... etc
};
}
private MahApps.Metro.Controls.WindowCommands LeftWindowCommandsGiveaway()
{
MahApps.Metro.Controls.WindowCommands command = new MahApps.Metro.Controls.WindowCommands();
command.Items.Add(
new Button { Content = "MyButton #1", Foreground = Brushes.Red });
return command;
}
}
的DataContext:
<Controls:MetroWindow.DataContext>
<ViewModels:MainViewModel/>
</Controls:MetroWindow.DataContext>
的TabControl:
<TabControl.ItemTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Header}" />
</DataTemplate>
</TabControl.ItemTemplate>
<TabControl.ContentTemplate>
<DataTemplate>
<Controls:MetroContentControl
Content="{Binding Content}" />
</DataTemplate>
</TabControl.ContentTemplate>
</TabControl>
这很有效。设计师展示了所有标签&amp;内容。 我如何绑定WindowCommands? 我想要这样的东西:
<Controls:MetroWindow.LeftWindowCommands>
<Controls:WindowCommands ItemsSource="{Binding LeftWindowCommands}">
</Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>
此外,我希望能够在MainViewModel中添加多个按钮。类似的东西:
private MahApps.Metro.Controls.WindowCommands LeftWindowCommandsGiveaway()
{
MahApps.Metro.Controls.WindowCommands command = new MahApps.Metro.Controls.WindowCommands();
command.Items.Add(
new Button { Content = "MyButton #1", Foreground = Brushes.Red });
command.Items.Add(
new Button { Content = "MyButton #2", Foreground = Brushes.Red });
return command;
}
答案 0 :(得分:1)
理想情况下,你会使用Bindings,但由于你使用的是代码隐藏,这里有一个简单的解决方案(如果你想让它适应像MVVM这样的模式,你可以自行决定):
基本上这段代码的作用是:
List
UIElements
包含所有子菜单(它们可以是任何内容,从简单的Button
到StackPanel
个完整的元素) 。
在WindowCommands
内,有一个TransitioningContentControl
,负责包含子菜单。
每当所选标签发生变化时,我会将List
的n位置加载到TransitioningContentControl
(n是TabControl
的所选索引)。
以下是我用于示例的代码,因此您可以对其进行调整:
public partial class MainWindow : MetroWindow
{
public List<UIElement> LeftWindowCommands { get; private set; }
public MainWindow()
{
InitializeComponent();
LeftWindowCommands = new List<UIElement>();
var StackPanelForTab1 = new StackPanel() { Orientation = Orientation.Horizontal };
var StackPanelForTab2 = new StackPanel() { Orientation = Orientation.Horizontal };
var StackPanelForTab3 = new StackPanel() { Orientation = Orientation.Horizontal };
// You can add as many children as you want
StackPanelForTab1.Children.Add(new Button { Content = "MyButton #1", Foreground = Brushes.Red });
StackPanelForTab2.Children.Add(new Button { Content = "MyButton #2", Foreground = Brushes.Black });
StackPanelForTab3.Children.Add(new Button { Content = "MyButton #3", Foreground = Brushes.Blue });
// MUST add items in the right order on the list
// MUST have the sabe amount of tabs on the TabControl and items on the list
LeftWindowCommands.Add(StackPanelForTab1);
LeftWindowCommands.Add(StackPanelForTab2);
LeftWindowCommands.Add(StackPanelForTab3);
}
private void TabControl_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (e.Source is TabControl)
{
MyContentControl.Content = LeftWindowCommands[MyTabControl.SelectedIndex];
}
}
}
<Controls:MetroWindow x:Class="WpfTests.MainWindow"
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:Controls="clr-namespace:MahApps.Metro.Controls;assembly=MahApps.Metro"
xmlns:local="clr-namespace:WpfTests"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Controls:MetroWindow.LeftWindowCommands>
<Controls:WindowCommands>
<Controls:TransitioningContentControl x:Name="MyContentControl" />
</Controls:WindowCommands>
</Controls:MetroWindow.LeftWindowCommands>
<TabControl SelectionChanged="TabControl_SelectionChanged" x:Name="MyTabControl" >
<TabItem Header="Tab #1">
<Label>#1</Label>
</TabItem>
<TabItem Header="Tab #2">
<Label>#2</Label>
</TabItem>
<TabItem Header="Tab #3">
<Label>#3</Label>
</TabItem>
</TabControl>
</Controls:MetroWindow>
你需要这个:
using MahApps.Metro.Controls;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
如果您尝试将其改编为MVVM并遇到任何麻烦,我可以随时为您提供帮助。