这是另一个漫长的编码日,而且我可能还在寻找一些东西。 但我无法弄清楚我错过了什么
ViewModel中的C#代码
public String MainWindowText { get; set; }
public DelegateCommand CommandClose { get; set; }
public TitlebarViewModel()
{
MainWindowText = "My Epic Window!";
CommandClose = new DelegateCommand(CloseMain);
}
public void CloseMain(Object Sender)
{
App.Current.MainWindow.Close();
}
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public virtual bool CanExecute(object parameter)
{
return _canExecute == null ? true : _canExecute(parameter);
}
public virtual void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
#pragma warning disable 67
public event EventHandler CanExecuteChanged;
#pragma warning restore 67
}
Xaml代码:
<Window.DataContext>
<VM:TitlebarViewModel/>
</Window.DataContext>
<Grid>
<DockPanel>
<Image x:Name="Icon" Width="30" Height="30"/>
<Button x:Name="Close" Content="X" Width="25" Height="25" DockPanel.Dock="Right" Margin="2" Command="{Binding CommandClose}"/>
<TextBlock x:Name="TitleBarText" Text="{Binding MainWindowText}" TextAlignment="Center" Margin="7"/>
</DockPanel>
</Grid>
所以MainWindow文本框显示我在c#构造函数中设置的内容,所以我知道datacontext工作正常。 我只是无法弄清楚为什么我无法在点击按钮时触发委托命令。
我知道这可能真的很愚蠢。它的东西很简单,但我一直盯着这个屏幕50分钟,我真的在寻找错误。 特别是当我完成了100次这样的操作时,我的解决方案中的其他控件已经完成了
谢谢你们。
答案 0 :(得分:0)
好的,按要求。此应用程序使用activeX控件。这种控制有空域问题。所以我用另一个窗口用透明度覆盖了一个窗口。
当你这样做时,你需要几乎重写整个代码来移动/拖动或窗口的任何东西。所以我已经加入了一些代码来允许“当我移动一个窗口移动它时,它”
所以我使用的是这段代码
private void EventHandlers()
{
this.LocationChanged += Titlebar_LocationChanged;
this.Loaded += Titlebar_Loaded;
this.PreviewMouseLeftButtonDown += Titlebar_PreviewMouseLeftButtonDown;
this.PreviewMouseLeftButtonUp += Titlebar_PreviewMouseLeftButtonUp;
this.MouseDoubleClick += Titlebar_MouseDoubleClick;
}
然而,请注意。此事件会触发事件处理程序,然后才会触发表单上的任何控件。
我只是将事件处理程序更改为
private void EventHandlers()
{
this.LocationChanged += Titlebar_LocationChanged;
this.Loaded += Titlebar_Loaded;
this.MouseLeftButtonDown += Titlebar_PreviewMouseLeftButtonDown;
this.PreviewMouseLeftButtonUp += Titlebar_PreviewMouseLeftButtonUp;
this.MouseDoubleClick += Titlebar_MouseDoubleClick;
}
此按钮在您按下控件中的任何按钮后发生。 是的,因为这似乎是有经验的程序员看起来很愚蠢。即使我们有时会有内存块。 请不要评价我。