我有一段时间对此感到困惑.我正在RibbonWindow
使用MVVM模式编写相当大的WPF应用程序.屏幕RibbonBar
顶部有一个菜单,其余部分显示各种视图.某些视图包含其他视图,其中一些视图具有启动子窗口的按钮.
到目前为止,我一直在使用View代码隐藏文件执行此操作,但我知道在使用MVVM时这些文件应该是空的.我可以将子窗口启动代码移动到ViewModel,但是我需要一个对main的引用RibbonWindow
(设置为子窗口所有者),这似乎不正确.
关于如何使用MVVM正常实现这一建议或提示将不胜感激.
从Angular应用程序中可以创建浏览器的子窗口并在其中显示一些预定义的角度组件.
澄清:我不是在寻找模态对话解决方案.
是否可以在Silverlight中制作像ChildWindow一样的ChildWindow,但是对于WPF?我尝试将Silverlight ChildWindow改编为WPF,但遇到了转换问题而无法设置Popup的Parent.我正在尝试制作一些类似于它的东西,所以我不必为弹出窗口添加代码到XAML.有任何想法吗?
问候!我喜欢使用MVVM轻巧的框架 - 让我的生活变得更加轻松,并且已经消除了许多难以克服的障碍......
题:
我正在尝试设置一个自定义对话框,用于编辑用户相互发送的消息.我正在尝试使用MVVM框架使用ChildWindow对象构造一个Silverlight自定义对话框.
想知道是否有任何关于如何实现这一点的建议
在我找到的对话框MVVM示例代码之后:http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId = 209338我被卡住了,因为Silverlight中的ChildWindow对话框对象是异步的,并且具有不同的Result类.
所以 - 我现在的基本思想是使用类的视图模型(在本例中为Matrix.MessageViewModel)来创建自定义对话框的实例,通过Messenger.Send <>发送它,处理已注册的消息显示对话框的视图,然后让ChildWindow对话框的Save按钮处理程序触发Messenger.Send,修改后的内容然后使用viewmodel上的Save方法存储...
看起来有点圆 - 所以想确保没有更清洁的方式....
相关代码位:
查看模型:
messageDialogBox = new MessageEditorDialog(
selectedMessage, this.SelectedSiteId, this.LoggedOnEmployee.Id, this.Projects);
DialogMessage editMessage = new DialogMessage(
this, messageDialogBox,"Edit Message", DialogMessageCallback);
Messenger.Default.Send(editMessage);
Run Code Online (Sandbox Code Playgroud)
视图:
public ViewHost()
{
InitializeComponent();
Loaded += new RoutedEventHandler(ViewHost_Loaded);
if (!ViewModelBase.IsInDesignModeStatic)
{
// Use MEF To load the View Model
CompositionInitializer.SatisfyImports(this);
}
ApplicationMessages.IsBusyMessage.Register(this, OnIsBusyChange);
Messenger.Default.Register<DialogMessage>(this, msg => ShowDialog(msg));
}
private void ShowDialog(DialogMessage msg)
{
MessageEditorDialog myDialog = (MessageEditorDialog) msg.Target;
myDialog.Show();
}
Run Code Online (Sandbox Code Playgroud)
对话保存: …
我是MVVM的新手,并试图找出如何使用MVVM Light Toolkit使用传统的Cancel按钮关闭ChildWindow.
在我的ChildWindow(StoreDetail.xaml)中,我有:
<Button x:Name="CancelButton" Content="Cancel" Command="{Binding CancelCommand}" />
Run Code Online (Sandbox Code Playgroud)
在我的ViewModel(ViewModelStoreDetail.cs)中,我有:
public ICommand CancelCommand { get; private set; }
public ViewModelStoreDetail()
{
CancelCommand = new RelayCommand(CancelEval);
}
private void CancelEval()
{
//Not sure if Messenger is the way to go here...
//Messenger.Default.Send<string>("ClosePostEventChildWindow", "ClosePostEventChildWindow");
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Silverlight的ChildWindow
对象进行确认对话.
理想情况下,我希望它能够工作MessageBox.Show()
,整个应用程序停止,直到从用户收到输入.
例如:
for (int i = 0; i < 5; i++)
{
if (i==3 && MessageBox.Show("Exit early?",
"Iterator", MessageBoxButton.OKCancel) == MessageBoxResult.OK)
{
break;
}
}
Run Code Online (Sandbox Code Playgroud)
如果用户点击OK,将停止迭代3 ...
但是,如果我要按照以下方式做某事:
ChildWindow confirm = new ChildWindow();
confirm.Title = "Iterator";
confirm.HasCloseButton = false;
Grid container = new Grid();
Button closeBtn = new Button();
closeBtn.Content = "Exit early";
closeBtn.Click += delegate { confirm.DialogResult = true; confirm.Close(); };
container.Children.Add(closeBtn);
Button continueBtn = new Button();
continueBtn.Content = "Continue!";
continueBtn.Click += delegate { …
Run Code Online (Sandbox Code Playgroud) 在我的Win32应用程序中,子窗口由第三方SDK创建.窗口创建过程是透明的,我无法将WndProc方法与子窗口关联.我希望能够在父窗口中捕获子窗口消息.我怎样才能做到这一点?任何帮助将受到高度赞赏.
我有一个WPF窗口,它必须表现为第三方正在运行的应用程序中窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口.
我已经回顾了这里提供的技术(WPF HwndSource技术)和这里(WPF SetParent技术).HwndSource技术根本不起作用.SetParent技术适用于Windows 7,但仅适用于基本主题.使用Windows 7 Aero主题时,它不起作用:我的子窗口是不可见的.
我正在寻找一个适用于所有Windows 7主题的解决方案.
我的测试应用程序创建一个测试窗口并调用SetParent使其成为记事本窗口(硬编码的HWND)的子窗口.
在基本主题下,它看起来像这样:
在Windows 7主题下,我没有看到它:
子窗口XAML:
<Window x:Class="WpfApplication22.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="300" Width="300" Background="#63000000" ShowInTaskbar="False" WindowStyle="None" Initialized="Window_Initialized" Loaded="Window_Loaded" AllowsTransparency="True">
<Grid>
<Ellipse Height="87" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="167" Fill="#FFBE3A3A" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
子窗口表单加载处理程序代码:
var parentHwnd = new IntPtr(0x01DE0DFC); // Running Notepad
var guestHandle = new WindowInteropHelper(this).Handle;
var style = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_POPUP;
SetWindowLong(guestHandle, GWL_STYLE, (int)(style));
SetParent(guestHandle, …
Run Code Online (Sandbox Code Playgroud) 我将NSWindow的自定义子类的childWindow添加到parentWindow(也是NSWindow的自定义子类).childWindow有NSBorderlessWindowMask和canBecomeKeyWindow:被重写以返回YES并且canBecomeMainWindow:返回NO.
childWindow设置为使用parentWindow调整大小.所以我想创建一个错觉,即childWindow的视图是parentWindow的一部分.主要思想是将基于文档的应用程序创建的文档窗口排列在主窗口中,以提供标签界面(就像在浏览器中一样)以在文档之间切换.
我的问题是每当我点击childWindow的一个视图时,parentWindow(主窗口)失去焦点,交通灯按钮变灰.这显然与我想要达到的目标背道而驰.
我找到了这个答案: 在没有关键窗口状态的NSPanel第一响应者中创建NSView
但即使我重写isKeyWindow :(主窗口)总是返回YES,但是当我点击childWindow时,标题栏会变灰.
我也尝试遵循这个建议:http: //www.cocoabuilder.com/archive/cocoa/143945-non-focused-child-window.html
但我不确定"在其nextResponder之前的响应链中包含子窗口"是什么意思.使用canBecomeKeyWindow:返回NO(对于childWindow),子节点内的视图永远不会成为键并且始终显示为灰色.
我有什么问题吗?
一个补充:是否可以在不给出childWindow键状态的情况下在childWindow FirstResponder中创建视图?
childwindow ×10
silverlight ×4
wpf ×4
mvvm ×2
mvvm-light ×2
winapi ×2
.net ×1
aero ×1
angular ×1
angular6 ×1
browser ×1
c# ×1
cocoa ×1
components ×1
confirm ×1
dialog ×1
focus ×1
icommand ×1
mfc ×1
nsresponder ×1
nswindow ×1
parent-child ×1
view ×1
viewmodel ×1
windows-7 ×1
wndproc ×1