如何在一个窗口使用多个xahtml文件转成xaml文件

WPF实现单进程实例应用程序(像Word一样可以打开多个文件) - 博客频道 - CSDN.NET
Fourier的博客
分类:WPF(MVVM)WPFC#
新建一个WPF应用程序,取名WPFSingleInstance
项目中添加引用:C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Profile\Client\Microsoft.VisualBasic.dll
在MainWindow中添加个一个Button,用来显示
新建一个文件,并重新命名名称空间,并添加如下代码:
namespace MyAppStartup
public class Startup
[STAThread]
public static void Main(string[] args)
SingleInstanceApplicationWrapper wrapper = new SingleInstanceApplicationWrapper();
wrapper.Run(args);
public class SingleInstanceApplicationWrapper : WindowsFormsApplicationBase
int Num=0;
public SingleInstanceApplicationWrapper()
this.IsSingleInstance = true;
protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e)
app = new App();
MainWindow win = new MainWindow();
win.Title = Num.ToString();
app.Run(win);
return false;
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs e)
MainWindow win = new MainWindow();
win.Title = Num.ToString();
win.Show();
Interaction logic for App.xaml
public partial class App : Application
右键项目属性-&Application-&Startup Object下拉菜单选择MyAppStartup.Startup
Build,然后生成exe文件,打开exe,会产生一个窗口,再双击exe文件,又产生一个窗口,但是你在任务管理器中查看,只有一个进程。
排名:千里之外
(2)(6)(21)(9)(2)silverLight如何从一个xaml页面跳转到另一个xaml
本回答由提问者推荐
var sogou_ad_id=731547;
var sogou_ad_height=160;
var sogou_ad_width=690;深入浅出 WPF教程之使用Grid来对WPF页面进行布局排
来源:未知
&对于以前用 Windows Form 来开发客户端程序的程序员,在使用 WPF 开发客户端的程序时,在窗体布局上将是他必须面对的一个坎。
&&& 布局产生困惑的一个典型场景如下:
&&& 我们在开发WPF窗体时候,我们会发现,当我们把菜单控件(Menu)、工具条(ToolBar、ToolBarPanel)、状态条 (StatusBar)这些最常见的页面元素拖动到WPF窗体的时候。我们会发现 WPF 窗体中,这些页面元素可以放置在任何位置,而不是之前 Windows Form 那样:主菜单在最上面,状态条在最下面。
&&& WPF中每一个元素如何布局变得更加灵活了,这样可以让美工更好的设计出更漂亮的页面,但是也会让一些缺乏艺术细胞的技术人员页面布局变得巨难看无比。比 如我最近在写个简单的调查系统客户端维护工具,使用WPF程序来开发,这个页面布局的事情,就让我非常头大。
&&& WPF 跟布局有关的控件很多,System.Windows.Controls.Panel 是这些所有布局有关的类的基类。需要注意的是,我们在页面布局上一般都是使用这个类的扩展类来处理布局,而不是使用这个类。这些扩展类包括:
System.Windows.Controls.Canvas (画布)
System.Windows.Controls.DockPanel (停靠布局)
System.Windows.Controls.Grid (表格)
System.Windows.Controls.StackPanel (堆栈布局)
System.Windows.Controls.VirtualizingPanel (虚堆栈布局)
System.Windows.Controls.WrapPanel (覆盖布局)
&&& 我自己在使用中觉得:对于我们从Window Form 习惯来的技术人员,使用 Grid (表格) 布局就可以满足我们绝大多数的布局需求,而且简单。下面我们就来介绍如何使用 Grid 布局控件来进行窗体布局设计。
&&& Grid 布局控件很类似 HTML 标签中的 Table 标签。我们事先把一个区域划分成不同的表格,然后决定,某些控件放在那个表格中,那些控件是要跨多少个表格来放置。比如下面窗体效果,是由后面的XAML 文件来实现这个效果的。
&&& 这个窗口布局上,我使用了Grid控件
&&& 我把这个窗口首先划分成三行三列的一个Grid。如上图我对这个窗体的拆分。
&&& 最上面的显示多少条目,以及下拉列表框,以及刷新按钮,被放在第一行,跨三列
&&& 未发布的调查表列表框被放在第二行,第一列,
&&& 支持来回拖动的GridSplitter被我放在了第二列,第二行
&&& ListView 则被我放在了第二行,第三列
&&& 最下面的确定,取消按钮被我放在了第三行,跨了三个列
&&& 上述界面效果的XAML文件如下:
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
x:Class=&HongjunGuo.SurveySystem.Client.QuestionnaireList&
Title=&调查列表& Height=&300& Width=&500&>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=&150&/>
<ColumnDefinition Width=&5& />
<ColumnDefinition Width=&*&/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=&35&/>
<RowDefinition Height=&*&/>
<RowDefinition Height=&35&/>
</Grid.RowDefinitions>
<DockPanel Height=&30& Name=&dockPanel2& Grid.ColumnSpan=&3& Grid.Row=&0&>
<Label>显示多少条目:</Label>
<ComboBox Height=&21& Name=&comboBox1& Width=&120& >
<ComboBoxItem IsSelected=&True& >5</ComboBoxItem>
<ComboBoxItem>10</ComboBoxItem>
<ComboBoxItem>20</ComboBoxItem>
<ComboBoxItem>50</ComboBoxItem>
</ComboBox>
<Button Height=&23& Name=&button1& Width=&75&>刷新</Button>
</DockPanel>
<ListBox IsSynchronizedWithCurrentItem=&True& Name=&lb_Type& Width=&Auto& Grid.Column=&0& Grid.Row=&1& >
<ListBoxItem Name=&lbi_Draft& ToolTip=&最近使用的,并且没有被发布的调查表& Content=&本地未发布的调查表草稿& Height=&50& IsSelected=&True&/>
<ListBoxItem Name=&lbi_Release& Content=&本地最近发布的调查表& Height=&50&/>
<ListBoxItem Name=&lbi_Seatch& Content=&服务器上的调查列表& Height=&50&/>
</ListBox>
<GridSplitter Grid.Column=&1& Grid.Row=&1& HorizontalAlignment=&Left& Name=&gridSplitter1& Width=&10& />
<ListView Name=&lv_Data& IsSynchronizedWithCurrentItem=&True& Grid.Column=&3& Grid.Row=&1&>
<ListView.View>
<GridView>
<GridViewColumn Header=&编号&>
</GridViewColumn>
<GridViewColumn Header=&标题&>
</GridViewColumn>
<GridViewColumn Header=&创建时间&>
</GridViewColumn>
</GridView>
</ListView.View>
</ListView>
<DockPanel Height=&30& Name=&dockPanel4& Grid.ColumnSpan=&3& Grid.Row=&2&>
<Button Height=&23& Name=&btn_OK& Width=&75& IsDefault=&True& Click=&btn_OK_Click&>确 定</Button>
<Button Height=&23& Name=&btn_Cancel& Width=&75& IsCancel=&True&>取 消</Button>
</DockPanel>
</Window>
使用Grid布局控件的时候,一些知识点如下:
&&& 我们可以通过定义Grid的ColumnDifinitions和RowDifinitions来实现对于表格的定义,然后根据Grid.Column和Grid.Row的对象来制定位置的方式实现布局。
&&& 比如上面XAML文件中
<Grid.ColumnDefinitions>
<ColumnDefinition Width=&150&/>
<ColumnDefinition Width=&5& />
<ColumnDefinition Width=&*&/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=&35&/>
<RowDefinition Height=&*&/>
<RowDefinition Height=&35&/>
</Grid.RowDefinitions>
&&& 就定义了一个三行三列的表格。
&&& ColumnDefinition 和 RowDefinition 分别只需要定义 Width 和 Height
&&& 如果我们希望列的宽度或者行的高度是根据内部元素来决定的,我们可以定义为 Auto, 如果我们希望某列或者某行的宽度或者告诉是整体的其他部分,则可以定义成 *,如果我们希望其中一项的长度是另外一项的5倍,则可以一个定义成*,一个定义成5* 。
&&& 我们看 ColumnDefinition 或者 RowDefinition 的 Width 或者 Height 属性的时候,我们可以看到这个属性不是 int或者 double 类型,而是 GridLength 类型。
&&& 下面一个简单的Grid定义来演示上面定义长度的几种写法&
<Window x:Class=&WpfApplication1.Window1&
xmlns=&/winfx/2006/xaml/presentation&
xmlns:x=&/winfx/2006/xaml&
Title=&Window1& Height=&300& Width=&300&>
<Grid.ColumnDefinitions>
<ColumnDefinition Width=&30&/>
<ColumnDefinition Width=&auto& />
<ColumnDefinition Width=&*& />
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height=&2*& />
<RowDefinition Height=&*& />
</Grid.RowDefinitions>
<Label Grid.Column=&0& Grid.Row=&0& Background=&RosyBrown& ></Label>
<Label Grid.Column=&1& Grid.Row=&0& Background=&SkyBlue& ></Label>
<Label Grid.Column=&2& Grid.Row=&0& Background=&Red& ></Label>
<Label Grid.Column=&0& Grid.Row=&1& Background=&SpringGreen& ></Label>
<Label Grid.Column=&1& Grid.Row=&1& Background=&RoyalBlue& >abc</Label>
<Label Grid.Column=&2& Grid.Row=&1& Background=&Violet& ></Label>
</Window>
&&& 这个XAML文件的效果图如下:
&&& 此外,我们还可以使用 Grid.ColumnSpan Grid.RowSpan 来实现一块布局跨多个表格项的情况。
&&& 小结:
&&& 我个人觉得,把一个窗体或者页面用表格拆分,然后我们在每个表格项中增加我们规划好的控件,这种布局方案在没有比较好的美术细胞下,比较容易做出一个至少不难看的页面布局。
&&& 基于以上的考虑,我觉得我们技术人员开发一些WPF窗体或者页面的时候,Grid控件应该是我们最常用到的。也应该是最应该掌握的控件。
-----------12135人阅读
编写WinForm程序时,都会碰到一个问题。就是WinForm窗口在不同分辨率下的大小问题。举例说明,你编写的WinForm窗口在下是合适、匀称的。不过,如果用户的计算机的分辨率为时,你的WinForm窗口就显得偏小,其中的字体和控件都显得偏小。如果用户的分辨率为640×480,那你的窗口就远远超过它的屏幕的大小。
  如何解决这个问题?一般的WinForm程序都会这样操作:程序启动——》获取屏幕分辨率——》调整窗体的大小——》调整各个控件大小及位置——》调整各个控件的字体。这样操作比较繁琐,并且要考虑到各种分辨率的情况。这样一来,如果WinForm窗口上有若干控件,调整是一件很痛苦的事。
  有没有这样的手段。我只要调整WinForm窗口的大小,其中的各个控件大小(包括字体)自动的等比例缩放?
  还记得一些DirectX的游戏程序吗?当设定为固定的分辨率时(比如800×600),在全屏的时候,他都会自动缩放。WinForm有这样的手段吗?
  答案是肯定的。在WPF中就能很简单的实现该功能。
  利用WPF中的ViewBox容器空间。ViewBox是一个容器空间,它会自动缩放容器中的子空间以填满自身,同时它只能有一个子控件。不过,我们可以把Canvas控件作为ViewBox控件的子控件。然后在Canvas控件中布局其他的控件。
  先看看下面的窗口的Xaml文件
  &Window x:Class=&Window1&
    xmlns=&&
    xmlns:x=&&
    Title=&WPFTest&
    mc:Ignorable=&d&
    xmlns:d=&&
    xmlns:mc=&http://schemas.openxmlformats.org/markup-compatibility/2006&&
    SizeToContent=&Manual& Width=&400& Height=&300&&
    &DockPanel& Name=&DockPanel1&& LastChildFill=&True&&
      &Menu Height=&23& Name=&Menu1&& DockPanel.Dock=&Top&&
        &MenuItem Header=&Menu1&&
          &MenuItem Header=&H1& /&
          &MenuItem Header=&H2& /&
        &/MenuItem&
          &MenuItem Header=&Menu2&&
          &MenuItem Header=&L1& /&
          &MenuItem Header=&L2& /&
          &Separator /&
          &MenuItem Header=&L4& /&
        &/MenuItem&
      &/Menu&
      &StatusBar Height=&23& Name=&StatusBar1&& DockPanel.Dock=&Bottom&&
        &StatusBarItem Content=&S1& Name=&S1&/&
        &StatusBarItem Content=&S2&&Name=&S2&/&
        &StatusBarItem Content=&S3&&Name=&S3&/&
      &/StatusBar&
      &Viewbox& Name=&Viewbox1& Stretch=&Fill&&
        &Canvas Height=&200& Name=&Canvas1& Width=&300& Background=&#FF8EDE75&&
          &Button Canvas.Left=&43& Canvas.Top=&40& Content=&Button& Height=&37& Name=&Button1& Width=&87& /&
        &/Canvas&
      &/Viewbox&
    &/DockPanel&
  &/Window&
  先简单的说明这个XAML文件
  最外面的是Window容器,设置了标题(WPFTest)和大小(400×300),它也只能有一个子控件。
  Window的子控件是DockPanel容器,是自动停靠容器控件。设置LastChildFill=&True&,表示最后一个子控件自动填充剩余的空间。没有设置大小,默认大小是Window的客户区大小。
  DockPanel控件有三个子控件
    Menu控件:菜单控件,自动停靠在容器的顶端
    StatusBar控件:状态栏控件,自动停靠在容器的底部
    ViewBox控件:容器控件,自动填充DockPanel剩余的控件。没有设置大小,为填充的大小。设置填充的模式为Fill,表示子控件填充自身的容器的大小
      在ViewBox中放置了一个Canvas控件,设置了大小(注:一定要设置大小,否则默认时会产生各种不可思议的效果),设置了背景色
      在Canvas中放置了一个Button控件。只是示例,Canvas中还能放置其他的控件
  在Window的代码中输入如下的代码
  Public Class Window1
    Private _I As Integer
    Private Sub Window1_SizeChanged(ByVal sender As Object, ByVal e As System.Windows.SizeChangedEventArgs) Handles Me.SizeChanged
      _I += 1
      Me.S1.Content = &窗口宽度:& & Me.Width
      Me.S2.Content = &内容宽度:& & Me.Viewbox1.Width
      Me.S3.Content = &按钮宽度:& & Me.Button1.Width & &;刷新次数:& & _I
    End Sub
  End Class
  启动后是如下的效果
  可以看出窗口的宽度是400,由于ViewBox没有设置宽度,故显示非数字,按钮的宽度是87
  拖动右下角,调整Window的大小。如下图所示
  和上图的比较,Window的大小发生了变化。ViewBox中的子控件也自动的拉伸了。这个从Button的外观能很明显的感受到。更神奇的是,无论我怎么调整Window的大小,Button的外观也随着Window的大小而改变,不过,在内部的逻辑中,Button的宽度始终是87,始终没有发生变化。
  另,由于Menu和StatusBar不在ViewBox内。故这两个控件没有缩放,还是原始的大小
  这给我们带来了极大的便利。无论window被调整到如何,在内部逻辑中,ViewBox中的子控件Canvas的逻辑大小始终是300×200。我们不需要再为调整后的大小设计额外的代码。
  实际上,我猜测。ViewBox的显示机制是,先在内存中把按照逻辑大小把子控件显示出来,然后等比例的缩放显示到ViewBox的客户区。
  回到开始的话题。编写的WinForm窗口如何应对不同的分辨率?
  在WPF中,将所有的客户控件放在Canvas中再放在ViewBox控件中,利用ViewBox的特性来实现自动的缩放。流程就变成了:程序启动——》获取屏幕分辨率——》调整窗体的大小。其余控件的缩放就交给ViewBox控件吧。而且由于逻辑的大小没有发生变化,你还不必要再额外添加代码。
  网上ViewBox控件介绍的比较少,用ViewBox来实现自适应窗体的大小确是独辟蹊径。
其实他说了那么多,其实就是添加几行代码而已。
建立WPF工程的时候不是会生成一个&Grid& &/Grid&标签么? &只要在这个标签下面(紧挨着Grid标签,不能在子标签里面)加上这几行代码:
&&Viewbox &Name=&Viewbox1& Stretch=&Fill&&
& & & & & & &Canvas Height=&350& Name=&Canvas1& Width=&525& &
&/Viewbox&
其中Canvas的宽度和高度应该设置为和最开始的window标签的宽度和高度一样,这样之后,只需要在Canvas标签里面继续写我们想要的布局就可以了,之后控件会自动进行缩放
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:673988次
积分:6970
积分:6970
排名:第2828名
原创:45篇
转载:389篇
评论:84条
(6)(2)(1)(5)(4)(1)(4)(13)(11)(11)(16)(30)(8)(7)(4)(11)(13)(11)(14)(8)(10)(2)(33)(14)(9)(15)(24)(3)(1)(1)(1)(5)(3)(7)(14)(7)(8)(1)(3)(5)(17)(3)(15)(6)(6)(16)(11)(1)(19)(4)

我要回帖

更多关于 不能是xaml文件的根 的文章

 

随机推荐