WPF如何显示指定位置的子窗口?

eHuaTian 2014-11-24 02:12:19
主启动界面上有一个Button,并知道子窗口的位置(如\childWin\dlg\win1.xaml),点击此Button时,如何将子窗口win1显示出来,Button内的代码怎么写?
...全文
1137 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
eHuaTian 2015-02-28
  • 打赏
  • 举报
回复
感谢capry0518的回答。新窗口的Click事件在ButtonClickCommand中处理了。 如果有多个新窗口怎么办呢,是不是每个新窗口的Click都要在ButtonClickCommand设置处理呢?如果新窗口中还有其它控件事件处理呢? 有没有其它更好的办法,
宇峰科技 2015-01-23
  • 打赏
  • 举报
回复
既然说到了配置文件,那就读取配置文件,用反射打开window
capry0518 2015-01-20
  • 打赏
  • 举报
回复
引用 16 楼 duanzi_peng 的回复:
[quote=引用 14 楼 capry0518 的回复:] 如果使用MVVM模式就不需要使用<x:Code>标签在内部写代码了,通过在XamlReader Load后将 ViewModel 对象设置到 xaml 实例对象的 DataContext 属性上就行啦
可以? 能不能 给个例子 研究一下。[/quote] 具体例子怎么贴呢,比如楼主说的新窗口界面布局定义成一个xaml资源文件 <Window 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" Title="MyWindow" d:DesignHeight="300" d:DesignWidth="300"> <Grid> <Button Content="响应按钮" HorizontalAlignment="Left" Margin="54,76,0,0" VerticalAlignment="Top" Width="75" Command="{Binding ButtonClickCommand}"/> </Grid> </Window> 例如窗口里边的Button本身是没有任何事件响应程序的,而是通过Command绑定来实现Click事件触发,当然通过Behavior行为EventTrigger触发器方式可以实现各种事件响应,总之响应程序要实现System.Windows.Input.ICommand接口即可。 接下来定义一个数据上下文和Command。 public class InvokeCommand : System.Windows.Input.ICommand { Action<object> action; public InvokeCommand(Action<object> action) { this.action = action; } public bool CanExecute(object parameter) { return true; } public event EventHandler CanExecuteChanged; public void Execute(object parameter) { if (this.action != null) { this.action(parameter); } } } public class MyWindowModel { public System.Windows.Input.ICommand ButtonClickCommand { get { return new InvokeCommand(parameter => { //TODO:执行方法逻辑。 MessageBox.Show("Hello"); }); } } } 将MyWindowModel的实例在打开子窗口前设置成子窗口的数据上下文,这样子窗口中按钮的Command就自动绑定到MyWindowModel.ButtonClickCommand处理程序上去了。 如下比如主窗口上的某个按钮用来打开子窗口。 private void Button_Click(object sender, RoutedEventArgs e) { //根据需要设置要打开的目标子窗口路径。 Uri windowUri = new Uri("MyWindow.xaml", UriKind.Relative);//子窗口xaml在项目根目录下的uri var stream = Application.GetResourceStream(windowUri); //加载子窗口。 System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader(); var obj = reader.LoadAsync(stream.Stream); Window myWindow = (Window)obj; //设置子窗口的数据上下文。 MyWindowModel viewmodel = new MyWindowModel(); myWindow.DataContext = viewmodel; //弹出子窗口 myWindow.ShowDialog(); } 至于命令参数parameter,那是来自于Button.CommandParameter属性,我例子里未设置就是null
capry0518 2014-12-06
  • 打赏
  • 举报
回复
本来MVVM模式就是最好的解决 XamlReader.Load 无法加载预置程序逻辑和绑定事件的 xaml 对象的解决方案。
capry0518 2014-12-06
  • 打赏
  • 举报
回复
如果使用MVVM模式就不需要使用<x:Code>标签在内部写代码了,通过在XamlReader Load后将 ViewModel 对象设置到 xaml 实例对象的 DataContext 属性上就行啦
exception92 2014-12-06
  • 打赏
  • 举报
回复
引用 14 楼 capry0518 的回复:
如果使用MVVM模式就不需要使用<x:Code>标签在内部写代码了,通过在XamlReader Load后将 ViewModel 对象设置到 xaml 实例对象的 DataContext 属性上就行啦
可以? 能不能 给个例子 研究一下。
eHuaTian 2014-11-30
  • 打赏
  • 举报
回复
谢谢。方法体在后台实现。<x:Code>的方法与后台如何关联阿能帮忙看看怎么弄。
exception92 2014-11-30
  • 打赏
  • 举报
回复
<x:Code> void okBtn_Click(object sender, RoutedEventArgs e)</x:Code> 你这句话 写对了么??你的方法体呢??方法体都没有 它会对么。 与后台关联暂时还不清楚
eHuaTian 2014-11-29
  • 打赏
  • 举报
回复
谢谢,现在将xaml 中的x:Class属性去掉,然后对xmal中的定义修改。 未去掉xaml 中的x:Class属性前,代码如下: <Button x:Name="okBtn" Content="确定" HorizontalAlignment="Left" Height="28" Margin="254,157,0,0" VerticalAlignment="Top" Width="55" Click="okBtn_Click" /> 去掉xaml 中的x:Class属性后,代码如下: <Button x:Name="okBtn" Content="确定" HorizontalAlignment="Left" Height="28" Margin="254,157,0,0" VerticalAlignment="Top" Width="55" Click="okBtn_Click" /> <x:Code> void okBtn_Click(object sender, RoutedEventArgs e)</x:Code> 编译程序,报错如下: 错误 1 “Window”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 Click 事件的事件处理程序,或将 x:Class 特性添加到根元素。 行 7 位置 73. G:\FMEDeveloper\fmeCruise\fmeCruise\InnerWins\corChangeDlg.xaml 7 73 fmeCruise 那如何将xaml中定义的事件与后台的页面C#代码相关联呢? 谢谢
exception92 2014-11-28
  • 打赏
  • 举报
回复
引用 9 楼 u011785544 的回复:
[quote=引用 8 楼 duanzi_peng 的回复:] [quote=引用 7 楼 eHuaTian 的回复:] 请大侠们帮帮忙哦。谢谢

 <Grid>
        <Button Width="120" Height="30" Content="Btn" Click="click"></Button>
        <x:Code>
            void click(object sender,RoutedEventArgs e){
               (sender as Button).Content="点击了我";
               MessageBox.Show("123456");
            }
        </x:Code>
         
    </Grid>
[/quote] 又学习了[/quote] 这个只是基本的静态操作,但是与数据文件的交互操作 还是没找到相关的资料。
Veary 2014-11-28
  • 打赏
  • 举报
回复
引用 8 楼 duanzi_peng 的回复:
[quote=引用 7 楼 eHuaTian 的回复:] 请大侠们帮帮忙哦。谢谢

 <Grid>
        <Button Width="120" Height="30" Content="Btn" Click="click"></Button>
        <x:Code>
            void click(object sender,RoutedEventArgs e){
               (sender as Button).Content="点击了我";
               MessageBox.Show("123456");
            }
        </x:Code>
         
    </Grid>
[/quote] 又学习了
exception92 2014-11-27
  • 打赏
  • 举报
回复
引用 7 楼 eHuaTian 的回复:
请大侠们帮帮忙哦。谢谢

 <Grid>
        <Button Width="120" Height="30" Content="Btn" Click="click"></Button>
        <x:Code>
            void click(object sender,RoutedEventArgs e){
               (sender as Button).Content="点击了我";
               MessageBox.Show("123456");
            }
        </x:Code>
         
    </Grid>
eHuaTian 2014-11-27
  • 打赏
  • 举报
回复
请大侠们帮帮忙哦。谢谢
exception92 2014-11-25
  • 打赏
  • 举报
回复

StreamReader reader = new StreamReader("d:/StackPanel.xaml");
Window content = XamlReader.Load(reader.BaseStream) as Window;
content.Show();
reader.Close();
将你的xaml 中的x:Class属性去掉。 XamlReader 的nameSpace是System.Windows.Markup;
eHuaTian 2014-11-25
  • 打赏
  • 举报
回复
那窗口里面的事件怎么处理呢,如Button的点击?谢谢
exception92 2014-11-25
  • 打赏
  • 举报
回复
引用 4 楼 eHuaTian 的回复:
谢谢。将xaml 中的x:Class属性去掉就会出现编译错误,提示错误如下: 错误 1 “Window”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 Click 事件的事件处理程序,或将 x:Class 特性添加到根元素。 行 6 位置 140. G:\FMEDeveloper\fmeCruise\fmeCruise\InnerWins\corChangeDlg.xaml 6 140 fmeCruise
xaml里是不能有任何事件的。 这肯定不是你想要的。它现在执行load一个无路由事件的xaml文件。
eHuaTian 2014-11-25
  • 打赏
  • 举报
回复
谢谢。将xaml 中的x:Class属性去掉就会出现编译错误,提示错误如下: 错误 1 “Window”根元素需要 x:Class 特性来支持 XAML 文件中的事件处理程序。请移除 Click 事件的事件处理程序,或将 x:Class 特性添加到根元素。 行 6 位置 140. G:\FMEDeveloper\fmeCruise\fmeCruise\InnerWins\corChangeDlg.xaml 6 140 fmeCruise
eHuaTian 2014-11-24
  • 打赏
  • 举报
回复
这样做也是可以的,但有时并不实用。比如:一个界面上有10个Button,各个Button分别对应着不同子窗口,如果分别直接show窗体,对初始程序也许是可以的。但如果用户使用一段时间后要增加一个新的窗体,则需要将整个源代码打开以用于添加新的窗体并show它,代码不利于维护。现在如果将各个窗体的实际路径放在xml配置文件中(如\childWin\dlg\win1.xaml),程序运行时读取此xml配置文件,当点击任意一个Button时,只需要读取对应的配置项并显示此窗体即可。这样不同的人可以开发不同的对话框,互不干扰。如果有新的需要,只要修改配置文件即可,比较方便。 不知我有没有说清楚。谢谢
exception92 2014-11-24
  • 打赏
  • 举报
回复
引用win1 的命名空间,直接show不就可以了?
在Windows系统中,notepad.exe(记事本)是一个“经典的”、“简洁的”文本编辑器。这个软件,没有华丽的外观,也没有繁杂的功能,仅仅是一个文本编辑小软件。虽然经过Windows系统数十年的变换,但它却保持着永恒姿态,数十年来几乎不曾改变过。曾经,VS中的经典DEMO中,就有它的身影,一个新建的项目,就藏有一个新建的“记事本”。然而,在WPF的项目中,“记事本”却消失的无影无踪,也许是很容易实现,也许是为了革新,而不愿再传承“经典”。确实,使用WPF技术再次让“记事本”复活,确实也是一件非常容易的事情。但是,如果,使用WPF技术,再搭配当下非常流行的MVVM模式呢?复活“记事本”的难度却陡然上升至很多WPF程序员为之默默叹气。而,MVVM模式是掌握WPF的最顶级技术,MVVM模式拥有的无尽的优势,让WPF相对于过往的编程模式来说,是一种革命性的创新,从而也成为大中型WPF项目中必须的模式。但,学习难度。。。。。。在这个《WPF记事本开发详解》的课程中,赵老师带领你在WPF中,从零开始一步步构建MVVM模式,直到让你亲自以WPF+MVVM的方式,让这个经典的“记事本”软件从你的手中“复活”。在课程中,赵老师会详细讲解WPF和MVVM中的各种技巧,让你从此爱上WPF+MVVM编程。

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧