Это был еще один длинный день кодирования, и я, вероятно, что-то искал. Но я не могу понять, что ive пропустил
Код С# в ViewModel
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 показывает, что я установил в конструкторе С#, поэтому я знаю, что datacontext работает нормально. Я просто не могу понять, почему я не могу заставить делегированную команду запускаться при нажатии на кнопку.
Я знаю, что это, наверное, действительно глупо. и его что-то простое, но ive смотрел на этот экран в течение 50 минут, и я действительно искал ошибку. особенно когда я делал это 100 раз, и в других элементах управления по всему моему решению
Спасибо, парни.
Хорошо, как просили. это приложение использует элемент управления 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;
}
этот триггер происходит после нажатия любой кнопки внутри элемента управления. Да, так глупо, как это может показаться опытным программистам. даже иногда мы имеем блоки памяти. пожалуйста, не судите меня.