WPF设计问题

时间:2009-02-12 21:53:00

标签: c# .net wpf layout

让我们说我正在开发一个聊天,首先你来到一个登录窗口,当你登录时我想使用相同的窗口但是控制控制:P怎么会是最好的方法来解决这个问题?

有没有什么好方法可以实现我应该使用什么根元素?

非常感谢!!

6 个答案:

答案 0 :(得分:2)

在MSDN杂志(http://msdn.microsoft.com/en-us/magazine/dd419663.aspx)中查看Josh Smith的文章。他描述了一种有趣的方法,在主窗口上有一个内容展示器,使用数据模板来切换窗口显示的内容。

答案 1 :(得分:1)

如果要在同一窗口中完成所有操作,可以使用Grid作为根元素并托管登录元素(可能是另一个布局网格)和聊天窗口。这些元素将叠加在一起,具体取决于您声明它们的顺序。要最初隐藏聊天元素,请将其可见性设置为Collapsed

然后,当用户提交登录详细信息并将聊天元素的可见性设置为Collapsed时,您可以将登录元素的可见性设置为Visible

我曾做过类似的事情,但对我来说效果很好。

希望有所帮助。

编辑我在Kaxaml中一起敲了你一起玩(因为我喜欢玩XAML):

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
    <Border x:Name="_loginForm" BorderBrush="#888" BorderThickness="3" CornerRadius="5"
            HorizontalAlignment="Center" VerticalAlignment="Center" Padding="10" Visibility="Visible">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition/>
          <RowDefinition/>
          <RowDefinition/>
          <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="100"/>
          <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <TextBlock Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" HorizontalAlignment="Center" Height="30">Welcome to chat</TextBlock>
        <TextBlock Grid.Row="1" Grid.Column="0">User Name</TextBlock>
        <TextBox   Grid.Row="1" Grid.Column="1" x:Name="_userName" />
        <TextBlock Grid.Row="2" Grid.Column="0">Password</TextBlock>
        <TextBox   Grid.Row="2" Grid.Column="1" x:Name="_password"></TextBox>
        <Button    Grid.Row="3" Grid.Column="1">Log In</Button>
      </Grid>
    </Border>
    <DockPanel x:Name="_chatForm" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" LastChildFill="True" Visibility="Collapsed">
      <DockPanel DockPanel.Dock="Bottom" LastChildFill="True" Height="70">
        <Button DockPanel.Dock="Right" Width="70">_Send</Button>
        <TextBox x:Name="_input" HorizontalAlignment="Stretch">Hello world</TextBox>
      </DockPanel>
      <ListBox x:Name="_messageHistory" />
    </DockPanel>
  </Grid>
</Page>

最初,元素_loginForm可见。您将为登录按钮的Click事件附加一个隐藏它的处理程序,并显示_chatForm

此示例显示了几个布局控件的使用 - Grid,DockPanel和StackPanel。

答案 2 :(得分:0)

或者,您可以使用StackPanel进行布局。举个简单的例子,你的面板中可以有2个元素;自定义登录控件以及聊天'显示'控件。成功登录后,从堆栈中删除自定义登录控件,以便只显示聊天。

答案 3 :(得分:0)

这是WPF!将它们设置为进出视图...您现在可以执行此操作。谷歌代码上有一个名为Witty的协作项目(一个用WPF编写的桌面Twitter客户端),他们做了一些非常酷的事情,你可能想借用它们。想想看,还有另一个WPF推特客户端(蓝光)可以做你想看的类似动画。

在Witty中,“设置”对话框是一个普通窗口,但是当您在选项卡之间切换时,故事板会将您请求的窗口部分滑动到视图中。我没有调试此级别的应用程序,但我假设他们有一个水平的StackPanel,其中填充了固定到对话框高度和宽度的容器,并且他们使用故事板将它们滑入和滑出。

看看这两个应用程序的想法。你可能想做类似的事情,但由于这是一个WPF应用程序,天空真的是极限。

Witty

blu

答案 4 :(得分:0)

这里已经有了一些答案,如何在视图级别交换两个元素。这篇文章提供了一种从根本上创建具有可互换视图的模块化应用程序设计的方法。

您可以查看Composite Application Library。它是一个小型库(由Microsoft开发),除其他外,它有助于使您的应用程序更加模块化。通过这种方式,您可以定义GUI的区域,这些区域可以具有可互换的视图。

在包含xaml中导入CAL命名空间并使用RegionManager定义区域:

<Window ...
      xmlns:cal="http://www.codeplex.com/CompositeWPF"
 ...>
...
<ItemsControl cal:RegionManager.RegionName="MyRegion" />
...

然后您可以在此区域中交换视图,最好是在模块

_regionManager.Regions["MyRegion"].Add(new LoginView());

... ...交换

_regionManager.Regions["MyRegion"].Add(new ChatView());

这当然只是你能做什么的概述。为了实现此解决方案,您必须进一步了解CAL。它有很好的文档和很多可以学习的例子。

答案 5 :(得分:0)

我认为更直观的解决方案是使用Frame控件作为窗口的基本控件 - 并使用NavigateService将Frame的源更改为不同的Page控件(可以在单独的程序集中定义,或者在与不同的XAML文件相同的项目。)

你的窗口:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <Frame Source="LogonPage.xaml" NavigationUIVisibility="Hidden" />

</Window>

你的单独登录页面:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Logon">

    <!-- Your content of the page goes here... -->
</Page>