通过单击按钮更改窗口内容

时间:2014-01-16 14:08:27

标签: c# wpf dynamic window

即使有其他答案,我也会张贴这个,因为我尝试了很多解决方案,但我找不到适合我的问题。

我做了一些截图来更好地解释自己。

我的应用程序看起来像这样:

http://imgur.com/epzRBlq

A,B,C,D和灰色的是简单的按钮。

如果我点击A,我希望内容改变,变成这样:

http://imgur.com/j9TiBEO

如果我点击B,C,D相同,但内容会有所不同。

进一步深入,我希望按钮E,F,G,H和更多in-depht按钮发生同样的事情。 (所有应用程序都基于4键设计)。

到目前为止,我使用以下XAML代码构建了应用程序主窗口的设计:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525" Name="RootWindow" >


    <Grid>

       <Grid.ColumnDefinitions>
           <ColumnDefinition />
           <ColumnDefinition />

       </Grid.ColumnDefinitions>
       <Grid.RowDefinitions>
           <RowDefinition  />
           <RowDefinition />
           <RowDefinition Height="10"/>
        <RowDefinition Height="40"/>

        </Grid.RowDefinitions>

    <Button Name="Audiovisiva" Grid.Row="0" Grid.Column="0" Background="Yellow"     FontWeight="Bold" FontSize="24" Foreground="#FF7F00FF" >A</Button>
    <Button Name="Orientamento" Grid.Row="0" Grid.Column="1" Background="Red" Foreground="#FF00FF15" FontSize="24" FontWeight="Bold">B</Button>
    <Button Name="Button3" Grid.Row="1" Grid.Column="0" Background="#FFB900FF" Foreground="#FFFBFF00" FontSize="24" FontWeight="Bold">C</Button>
    <Button Name="Button4" Grid.Row="1" Grid.Column="1" Background="#FF00EBFF" Foreground="#FFFFC902" FontSize="24" FontWeight="Bold">D</Button>
    <Button Name="Button5" Grid.Row="4" Grid.Column="0">Back</Button>
    <Button Name="Button6" Grid.Row="4" Grid.Column="1">Next</Button>



    </Grid>
</Window>

我的问题是:在这种情况下,是否有一种显示动态内容的聪明方法? (我是WPF编程的新手,所以请解释我以及可能)。

请记住,会有很多可能的图层,因为每个按钮都必须“生成”一组新的4个按钮,每次深入到应用程序内部。

感谢您提供给我的任何帮助!

编辑:

不,一旦我点击“A”,没有“A”会重复。主要目标是创建一个套件,您可以在其中选择A,B,C,D之间的选项,如果您得到“A”,下一个视图将显示4个按钮,可在“A”的不同选项之间进行选择功能。举个例子,假设如果我选择“阅读”功能,在下一个视图中我可以选择“开始”,“选项”,“某事”,“主页”。如果我按“开始”我想启动我的应用程序核心(在这种情况下,阅读练习),如果我按“选项”我想在“阅读速度”,“字体大小”ecc ...之间进行选择设置我的阅读练习选项,如果按“其他东西”将会完成,如果我按“主页”我想回到第一个屏幕。

主要目的是在4个按钮屏幕之间导航以设置选项,然后按“开始”按钮开始个性化练习。

我希望我能很好地解释自己。

2 个答案:

答案 0 :(得分:0)

您希望展示的新功能有哪些内容?

您只需要在每个方块的按钮中添加buttonclickevents。 例如:

Button Name =“Audiovisiva”Grid.Row =“0”Grid.Column =“0”Background =“Yellow”FontWeight =“Bold”FontSize =“24”Foreground =“#FF7F00FF”Button.Click =“Button1_Click “&gt;

然后

private void button1_Click(object sender,EventArgs e)         {            //在这里行动         }

我认为,在网格的顶部,你放了4个画布,你可以很容易地改变内容的格式。 像canvas.content =“image”

答案 1 :(得分:0)

使用来自您的帖子/编辑的信息以及DataBinding这里的一些工作示例。

首先创建一个类Item,其中a)表示按钮b)保存按钮信息,c)是复合模式

因此Item可以{/ 1}}内置

Items

这是MainWindow.xaml

public class Item
{
    public Item(string letter, Brush back, Brush front)
    {

        Letter = letter;
        BackColor = back;
        FrontColor = front;
    }

    public Item(string letter, Brush back, Brush front, List<Item> items)
        : this(letter, back, front)
    {
        Items = items;
    }

    public List<Item> Items { get; set; }


    public string Letter { get; set; }
    public Brush BackColor { get; set; }
    public Brush FrontColor { get; set; }
}

这是MainWindow.cs

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:wpfApplication1="clr-namespace:WpfApplication1"
    Title="MainWindow" Height="350" Width="525"
    DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>

    <Grid.Resources>
        <DataTemplate DataType="{x:Type wpfApplication1:Item}">
            <Button Content="{Binding Letter}" Foreground="{Binding FrontColor}" Background="{Binding BackColor}" Click="Button_OnClick" Tag="{Binding}"/>
        </DataTemplate>
    </Grid.Resources>

    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition  />
        <RowDefinition />
        <RowDefinition Height="10"/>
        <RowDefinition Height="40"/>

    </Grid.RowDefinitions>

    <ContentPresenter Grid.Row="0" Grid.Column="0" Content="{Binding Items[0]}"/>
    <ContentPresenter Grid.Row="0" Grid.Column="1" Content="{Binding Items[1]}"/>
    <ContentPresenter Grid.Row="1" Grid.Column="0" Content="{Binding Items[2]}"/>
    <ContentPresenter Grid.Row="1" Grid.Column="1" Content="{Binding Items[3]}"/>

    <Button Name="Button5" Grid.Row="4" Grid.Column="0">Back</Button>
    <Button Name="Button6" Grid.Row="4" Grid.Column="1">Next</Button>



</Grid>

此示例应该开箱即用。要自定义关注我的代码 /// <summary> /// Interaktionslogik für MainWindow.xaml /// </summary> public partial class MainWindow : Window, INotifyPropertyChanged { public MainWindow() { Items = BuildItems(); InitializeComponent(); } private List<Item> BuildItems() { var list = new List<Item>(); // Add option "A" with suboptions list.Add(new Item("A", Brushes.Red, Brushes.Yellow, new List<Item> { new Item("E", Brushes.Green, Brushes.Black), new Item("F", Brushes.LightBlue, Brushes.Black), new Item("G", Brushes.Red, Brushes.Black), new Item("H", Brushes.LemonChiffon, Brushes.Black) })); // Add option "B" list.Add(new Item("B", Brushes.Yellow, Brushes.Green)); // Add option "C" list.Add(new Item("C", Brushes.Blue, Brushes.Yellow)); // Add option "D" list.Add(new Item("D", Brushes.GreenYellow, Brushes.Yellow)); return list; } private List<Item> item; public List<Item> Items { get { return item; } set { if (item != value) { item = value; OnPropertyChanged("Items"); } } } public event PropertyChangedEventHandler PropertyChanged; protected virtual void OnPropertyChanged(string propertyName) { var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); } private void Button_OnClick(object sender, RoutedEventArgs e) { var item = (sender as Button).Tag as Item; if (item != null && item.Items != null) Items = item.Items; } } 。在这一点上,您的要求非常灵活。但是,通过一些更深入的wpf知识,可以对代码进行一些改进(使用ICommand,ViewModels等)。

希望我能帮忙