1

这是又一个漫长的编码日,我可能正在寻找一些东西。但我不知道我错过了什么

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 次并且它在我的解决方案中的其他控件中时

多谢你们。

4

1 回答 1

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;
    }

这触发发生在您按下控件中的任何按钮后。是的,这对于有经验的程序员来说可能看起来很愚蠢。甚至我们有时也会有内存块。请不要评判我。

于 2014-08-28T14:09:47.323 回答