Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在代码隐藏中处理事件并调用视图模型';在某个事件上的命令_Wpf_Mvvm_Routed Events - Fatal编程技术网

Wpf 在代码隐藏中处理事件并调用视图模型';在某个事件上的命令

Wpf 在代码隐藏中处理事件并调用视图模型';在某个事件上的命令,wpf,mvvm,routed-events,Wpf,Mvvm,Routed Events,以下是概述: 我使用一个自定义控件(CusCtrl)来显示任务栏图标,它还有一个弹出属性。因此,当您单击图标时,CUSCRL将显示弹出窗口 我正在使用UserControl设置弹出窗口的子项(比如说UC1) 我正在使用ViewModel设置CUSCRL的DataContext,因此甚至UC1也会绑定到相应的ViewModel(比如说VM1) 现在UC1有了一些元素-一个标签,单击标签我需要两件事: 在视图模型VM1上调用命令- 通过该命令,我需要将视图模型的一些属性作为参数传递,并打开一些窗口U

以下是概述:

我使用一个自定义控件(CusCtrl)来显示任务栏图标,它还有一个弹出属性。因此,当您单击图标时,CUSCRL将显示弹出窗口

我正在使用UserControl设置弹出窗口的子项(比如说UC1

我正在使用ViewModel设置CUSCRL的DataContext,因此甚至UC1也会绑定到相应的ViewModel(比如说VM1

现在UC1有了一些元素-一个标签,单击标签我需要两件事:

  • 在视图模型VM1上调用命令-

    通过该命令,我需要将视图模型的一些属性作为参数传递,并打开一些窗口UI

  • 关闭弹出窗口-

    为此,我考虑在UserControl的代码隐藏中侦听MouseUp事件,然后触发路由事件(FirePopUpClose-此事件在UserControl UC1中定义),该事件将由应用程序处理,然后从 处理程序,将调用自定义Conntrol的ClosePopUp方法

  • 我确实知道如何使用交互性dll调用标签上MouseUp事件的命令,但是如何引发FirePopUpClose路由事件

    或者如何在标签上应用MouseUp事件处理程序以及将命令绑定到该标签


    我是否认为这是正确的方法,或者有更好的更干净的方法来执行一些UI操作,并通过坚持使用MVVM关闭弹出窗口?

    下一个解决方案如何;尝试使用Popup.IsOpen属性(,下面是使用示例)。直接或通过CusCtrl用户控件的DependencyProperty将其绑定到UC1 DataContext(必须在控件中创建封装弹出窗口的属性)。就这样,您将能够在没有事件的情况下管理打开或关闭的弹出窗口

    更新 试试下一个: 1.主要Xaml:

    <Window x:Class="PopupIsOpenDataBindingHelpAttempt.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:popupIsOpenDataBindingHelpAttempt="clr-namespace:PopupIsOpenDataBindingHelpAttempt"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <popupIsOpenDataBindingHelpAttempt:DemoMainViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <DataTemplate x:Key="PopupInnerControlDataTemplateKey" DataType="{x:Type popupIsOpenDataBindingHelpAttempt:TaskBarDemoViewModel}">
            <Grid Width="150" Height="85">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Text="{Binding TextString}"
                           Margin="5" Foreground="Red"
                           Width="150" TextWrapping="WrapWithOverflow"
                           VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
                <Button    Grid.Row="1" Content="Press to close" Command="{Binding PopupInnerButtonCommand}"
                        VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
            </Grid>
        </DataTemplate>
        <Image x:Key="ImageControl" Source="Pic/2015_10_16_Bing_en-US.jpg" IsHitTestVisible="False"/>
    </Window.Resources>
    <Grid Width="75" Height="75" HorizontalAlignment="Center" VerticalAlignment="Center">
        <popupIsOpenDataBindingHelpAttempt:TaskBarIconProjectDemo 
            ButtonContentProperty="{StaticResource ImageControl}"
            ButtonCommandProperty="{Binding ShowPopupCommand}"
            PopupIsOpenProperty="{Binding IsPopupOpen, UpdateSourceTrigger=PropertyChanged}"
            PopupInnerContentControlDataContext="{Binding TaskBarDemoViewModel, UpdateSourceTrigger=PropertyChanged}"
            PopupInnerContentControlContentTemplate="{StaticResource PopupInnerControlDataTemplateKey}"/>
    </Grid>
    
    四,。查看模型:

        public class DemoMainViewModel:BaseObservableObject
    {
        private bool _isOpen;
        private TaskBarDemoViewModel _taskBarDemoViewModel;
        private ICommand _showPopupCommnad;
    
        public DemoMainViewModel()
        {
            TaskBarDemoViewModel = new TaskBarDemoViewModel(ClosePopup, "Here you can put your content. Go for it...");
        }
    
        private void ClosePopup()
        {
            IsPopupOpen = false;
        }
    
        public bool IsPopupOpen
        {
            get { return _isOpen; }
            set
            {
                _isOpen = value;
                OnPropertyChanged();
            }
        }
    
        public TaskBarDemoViewModel TaskBarDemoViewModel    
        {
            get { return _taskBarDemoViewModel; }
            set
            {
                _taskBarDemoViewModel = value;
                OnPropertyChanged();
            }
        }
    
        public ICommand ShowPopupCommand
        {
            get { return _showPopupCommnad ?? (_showPopupCommnad = new RelayCommand(ShowPopup)); }
        }
    
        private void ShowPopup()
        {
            IsPopupOpen = true;
        }
    }
    
    public class TaskBarDemoViewModel:BaseObservableObject
    {
        private readonly Action _closePopupCommand;
        private ICommand _command;
        private string _textString;
    
        public TaskBarDemoViewModel(Action closePopupCommand, string content)
        {
            _closePopupCommand = closePopupCommand;
            TextString = content;
        }
    
        public ICommand PopupInnerButtonCommand
        {
            get { return _command ?? (_command = new RelayCommand(TargetMethod)); }
        }
    
        private void TargetMethod()
        {
            //add your logic here
            if(_closePopupCommand == null) return;
            _closePopupCommand();
        }
    
        public string TextString
        {
            get { return _textString; }
            set
            {
                _textString = value;
                OnPropertyChanged();
            }
        }
    }
    
    五,。按钮样式(根据需要进行更改):

    #FFD5E0EE
    #FFEAF1F8
    #FFF4C661
    #FFF4C87
    #FFD06D
    #FFFF0DF
    
  • BaseObserveObject是INCP的简单实现

  • RelayCommand是ICommand接口的简单实现

  • 如果你对代码有问题,我很乐意帮助你。
    关于,下一个解决方案是什么;尝试使用Popup.IsOpen属性(,下面是使用示例)。直接或通过CusCtrl用户控件的DependencyProperty将其绑定到UC1 DataContext(必须在控件中创建封装弹出窗口的属性)。就这样,您将能够在没有事件的情况下管理打开或关闭的弹出窗口

    更新 试试下一个: 1.主要Xaml:

    <Window x:Class="PopupIsOpenDataBindingHelpAttempt.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:popupIsOpenDataBindingHelpAttempt="clr-namespace:PopupIsOpenDataBindingHelpAttempt"
        xmlns:system="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Window.DataContext>
        <popupIsOpenDataBindingHelpAttempt:DemoMainViewModel/>
    </Window.DataContext>
    <Window.Resources>
        <DataTemplate x:Key="PopupInnerControlDataTemplateKey" DataType="{x:Type popupIsOpenDataBindingHelpAttempt:TaskBarDemoViewModel}">
            <Grid Width="150" Height="85">
                <Grid.RowDefinitions>
                    <RowDefinition></RowDefinition>
                    <RowDefinition></RowDefinition>
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Text="{Binding TextString}"
                           Margin="5" Foreground="Red"
                           Width="150" TextWrapping="WrapWithOverflow"
                           VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
                <Button    Grid.Row="1" Content="Press to close" Command="{Binding PopupInnerButtonCommand}"
                        VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
            </Grid>
        </DataTemplate>
        <Image x:Key="ImageControl" Source="Pic/2015_10_16_Bing_en-US.jpg" IsHitTestVisible="False"/>
    </Window.Resources>
    <Grid Width="75" Height="75" HorizontalAlignment="Center" VerticalAlignment="Center">
        <popupIsOpenDataBindingHelpAttempt:TaskBarIconProjectDemo 
            ButtonContentProperty="{StaticResource ImageControl}"
            ButtonCommandProperty="{Binding ShowPopupCommand}"
            PopupIsOpenProperty="{Binding IsPopupOpen, UpdateSourceTrigger=PropertyChanged}"
            PopupInnerContentControlDataContext="{Binding TaskBarDemoViewModel, UpdateSourceTrigger=PropertyChanged}"
            PopupInnerContentControlContentTemplate="{StaticResource PopupInnerControlDataTemplateKey}"/>
    </Grid>
    
    四,。查看模型:

        public class DemoMainViewModel:BaseObservableObject
    {
        private bool _isOpen;
        private TaskBarDemoViewModel _taskBarDemoViewModel;
        private ICommand _showPopupCommnad;
    
        public DemoMainViewModel()
        {
            TaskBarDemoViewModel = new TaskBarDemoViewModel(ClosePopup, "Here you can put your content. Go for it...");
        }
    
        private void ClosePopup()
        {
            IsPopupOpen = false;
        }
    
        public bool IsPopupOpen
        {
            get { return _isOpen; }
            set
            {
                _isOpen = value;
                OnPropertyChanged();
            }
        }
    
        public TaskBarDemoViewModel TaskBarDemoViewModel    
        {
            get { return _taskBarDemoViewModel; }
            set
            {
                _taskBarDemoViewModel = value;
                OnPropertyChanged();
            }
        }
    
        public ICommand ShowPopupCommand
        {
            get { return _showPopupCommnad ?? (_showPopupCommnad = new RelayCommand(ShowPopup)); }
        }
    
        private void ShowPopup()
        {
            IsPopupOpen = true;
        }
    }
    
    public class TaskBarDemoViewModel:BaseObservableObject
    {
        private readonly Action _closePopupCommand;
        private ICommand _command;
        private string _textString;
    
        public TaskBarDemoViewModel(Action closePopupCommand, string content)
        {
            _closePopupCommand = closePopupCommand;
            TextString = content;
        }
    
        public ICommand PopupInnerButtonCommand
        {
            get { return _command ?? (_command = new RelayCommand(TargetMethod)); }
        }
    
        private void TargetMethod()
        {
            //add your logic here
            if(_closePopupCommand == null) return;
            _closePopupCommand();
        }
    
        public string TextString
        {
            get { return _textString; }
            set
            {
                _textString = value;
                OnPropertyChanged();
            }
        }
    }
    
    五,。按钮样式(根据需要进行更改):

    #FFD5E0EE
    #FFEAF1F8
    #FFF4C661
    #FFF4C87
    #FFD06D
    #FFFF0DF
    
        <Color x:Key="ButtonLowerPartKey">#FFD5E0EE</Color>
        <Color x:Key="ButtonUpperPartKey">#FFEAF1F8</Color>
        <Color x:Key="PressedColorButtonLowerPartKey">#FFF4C661</Color>
        <Color x:Key="PressedButtonUpperPartKey">#FFF4CC87</Color>
        <Color x:Key="HooveredButtonLowerPartKey">#FFFFD06D</Color>
        <Color x:Key="HooveredButtonUpperPartKey">#FFFFF0DF</Color>
        <Style x:Key="SpecialButtonStyle" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}">
            <Setter Property="Padding" Value="5">
            </Setter>
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate>
                        <Grid x:Name="Grid">
                            <Ellipse x:Name="ButtonControlBorder" Stroke="{TemplateBinding BorderBrush}" 
                                     StrokeThickness="{TemplateBinding BorderThickness}" 
                                     Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                                <Ellipse.Fill>
                                    <LinearGradientBrush x:Name="BrushKey" MappingMode="RelativeToBoundingBox" SpreadMethod="Repeat" StartPoint="0.5,0" EndPoint="0.5,1">
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Offset="0.5" Color="{StaticResource ButtonUpperPartKey}" />
                                            <GradientStop Offset="0.5" Color="{StaticResource ButtonUpperPartKey}" />
                                            <GradientStop Offset="0.5" Color="{StaticResource ButtonLowerPartKey}" />
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Ellipse.Fill>
                            </Ellipse>
                            <Ellipse x:Name="Pressed" Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Opacity="0">
                                <Ellipse.Fill>
                                    <LinearGradientBrush x:Name="PressedBrushKey" MappingMode="RelativeToBoundingBox" SpreadMethod="Repeat" StartPoint="0.5,0" EndPoint="0.5,1">
                                        <LinearGradientBrush.GradientStops>
                                            <GradientStop Offset="0.5" Color="{StaticResource PressedButtonUpperPartKey}" />
                                            <GradientStop Offset="0.5" Color="{StaticResource PressedButtonUpperPartKey}" />
                                            <GradientStop Offset="0.5" Color="{StaticResource PressedColorButtonLowerPartKey}" />
                                        </LinearGradientBrush.GradientStops>
                                    </LinearGradientBrush>
                                </Ellipse.Fill>
                            </Ellipse>
                            <Ellipse x:Name="InnerPressed" 
                                    Width="{Binding ElementName=Pressed, Path=Width}" Height="{Binding ElementName=Pressed, Path=Height}" 
                                    Stroke="DarkOrange" Opacity="0" StrokeThickness="1" SnapsToDevicePixels="True" Fill="Transparent"/>
                            <ContentPresenter Content="{TemplateBinding Button.Content}" HorizontalAlignment="Center" VerticalAlignment="Center">
                                <ContentPresenter.OpacityMask>
                                    <VisualBrush Visual="{Binding ElementName=ButtonControlBorder}" />
                                </ContentPresenter.OpacityMask>
                            </ContentPresenter>
                            <Grid.Triggers>
                                <EventTrigger RoutedEvent="Mouse.MouseEnter">
                                    <BeginStoryboard x:Name="MouseEnterStoryboard">
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="BrushKey" Storyboard.TargetProperty="GradientStops[0].Color" From="{StaticResource ButtonUpperPartKey}" To="{StaticResource HooveredButtonUpperPartKey}" Duration="0:0:0.3" AutoReverse="False" />
                                            <ColorAnimation Storyboard.TargetName="BrushKey" Storyboard.TargetProperty="GradientStops[2].Color" From="{StaticResource ButtonLowerPartKey}" To="{StaticResource HooveredButtonLowerPartKey}" Duration="0:0:0.3" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                                <EventTrigger RoutedEvent="Mouse.MouseLeave">
                                    <BeginStoryboard>
                                        <Storyboard>
                                            <ColorAnimation Storyboard.TargetName="BrushKey" Storyboard.TargetProperty="GradientStops[0].Color" From="{StaticResource HooveredButtonUpperPartKey}" To="{StaticResource ButtonUpperPartKey}" Duration="0:0:1" AutoReverse="False" />
                                            <ColorAnimation Storyboard.TargetName="BrushKey" Storyboard.TargetProperty="GradientStops[2].Color" From="{StaticResource HooveredButtonLowerPartKey}" To="{StaticResource ButtonLowerPartKey}" Duration="0:0:1" />
                                        </Storyboard>
                                    </BeginStoryboard>
                                </EventTrigger>
                            </Grid.Triggers>
                        </Grid>
                        <ControlTemplate.Resources>
                            <Storyboard x:Key="MouseUpTimeLine">
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                            <Storyboard x:Key="MouseDownTimeLine">
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="Pressed" Storyboard.TargetProperty="Opacity">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="0.8" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                            <Storyboard x:Key="InnerPressedMouseUpTimeLine">
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="InnerPressed" Storyboard.TargetProperty="Opacity">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00.25" Value="0" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                            <Storyboard x:Key="InnerPressedMouseDownTimeLine">
                                <DoubleAnimationUsingKeyFrames BeginTime="00:00:00" Storyboard.TargetName="InnerPressed" Storyboard.TargetProperty="Opacity">
                                    <SplineDoubleKeyFrame KeyTime="00:00:00.05" Value="1" />
                                </DoubleAnimationUsingKeyFrames>
                            </Storyboard>
                        </ControlTemplate.Resources>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsMouseOver" SourceName="Grid" Value="True">
                                <Setter Property="Stroke" TargetName="ButtonControlBorder">
                                    <Setter.Value>
                                        <SolidColorBrush Color="{StaticResource HooveredButtonLowerPartKey}">
                                        </SolidColorBrush>
                                    </Setter.Value>
                                </Setter>
                            </Trigger>
                            <Trigger Property="ButtonBase.IsPressed" Value="True">
                                <Trigger.EnterActions>
                                    <BeginStoryboard Storyboard="{StaticResource MouseDownTimeLine}" />
                                    <BeginStoryboard Storyboard="{StaticResource InnerPressedMouseDownTimeLine}">
                                    </BeginStoryboard>
                                </Trigger.EnterActions>
                                <Trigger.ExitActions>
                                    <BeginStoryboard Storyboard="{StaticResource MouseUpTimeLine}" />
                                    <BeginStoryboard Storyboard="{StaticResource InnerPressedMouseUpTimeLine}">
                                    </BeginStoryboard>
                                </Trigger.ExitActions>
                            </Trigger>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>