小编Dea*_*one的帖子

将方法从视图移动到viewmodel - WPF MVVM

我的代码背后有以下代码:

public partial class MainWindow
{
    private Track _movieSkipSliderTrack;
    private Slider sMovieSkipSlider = null;
    private Label lbTimeTooltip = null;
    private MediaElement Player = null;

    public VideoPlayerViewModel ViewModel
    {
        get { return DataContext as VideoPlayerViewModel; }
    }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void SMovieSkipSlider_OnLoaded(object sender, RoutedEventArgs e)
    {
        _movieSkipSliderTrack = (Track)sMovieSkipSlider.Template.FindName("PART_Track", sMovieSkipSlider);
        _movieSkipSliderTrack.Thumb.DragDelta += Thumb_DragDelta;
        _movieSkipSliderTrack.Thumb.MouseEnter += Thumb_MouseEnter;
    }

    private void Thumb_MouseEnter(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed && e.MouseDevice.Captured == null)
        {
            var args = new MouseButtonEventArgs(e.MouseDevice, …
Run Code Online (Sandbox Code Playgroud)

c# wpf view mvvm viewmodel

5
推荐指数
1
解决办法
786
查看次数

WPF应用程序中的条件设置

我正在为我的媒体播放器制作用户可更改的设置,而我正在努力找到解决问题的优雅方案.

例如,我的一个设置 - 暂停视频的最后一帧,如果没有选中,它将继续通过播放列表,或者只有1个文件,重置它并在开始时暂停.

这就是我实现它的方式:

private void OnMediaEndedCommand()
{
    if (GeneralSettings.PauseOnLastFrame)
    {
        MediaPlayer.SetMediaState(MediaPlayerStates.Pause);
        return;
    }
    if (PlayListViewModel.FilesCollection.Last().Equals(PlayListViewModel.FilesCollection.Current) && !Repeat)
    {
        ChangeMediaPlayerSource(PlayListViewModel.ChangeCurrent(() => PlayListViewModel.FilesCollection.MoveNext()));
        MediaPlayer.SetMediaState(MediaPlayerStates.Stop);
        return;
    }
    ChangeMediaPlayerSource(PlayListViewModel.ChangeCurrent(() => PlayListViewModel.FilesCollection.MoveNext()));
}
Run Code Online (Sandbox Code Playgroud)

它包含在主窗口的ViewModel中,其中media元素是GeneralSettings.PauseOnLastFrame布尔属性.

此命令绑定如下:

<MediaElement ....>
    <ia:Interaction.Triggers>
        <ia:EventTrigger EventName="MediaEnded">
            <ia:InvokeCommandAction Command="{Binding MediaEndedCommand}"/>
        </ia:EventTrigger>
    </ia:Interaction.Triggers>
</MediaElement>
Run Code Online (Sandbox Code Playgroud)

它有效,但很糟糕,我该如何以优雅的方式实现这样的设置系统呢?某些设置可能不是布尔值,它们可能有多个选项,有些可能仅在启动时应用,而其他设置如上图所示,基于事件.

c# wpf settings binding

5
推荐指数
2
解决办法
414
查看次数

检测外部进程的窗口是否闪烁/闪烁

我如何检测我无法控制的进程何时因某些通知而闪烁。我只见过专注于您可以控制的应用程序的解决方案。在我的情况下,可能有多个所述进程同时处于活动状态,其中一个可能正在闪烁。

这是我的尝试:

using (Process process = Process.GetProcesses().FirstOrDefault(p => p.ProcessName.ToLower() == "..."))
using (ProcessModule module = process.MainModule)
{

    var a = GetModuleHandleEx(0x00000004, module.ModuleName, out var hModule);
    var hHook = SetWindowsHookEx(HookType.WH_SHELL, (code, param, lParam) =>
    {
        //test
        return IntPtr.Zero;
    }, hModule, 0);
}
Run Code Online (Sandbox Code Playgroud)

其中DLL导入如下:

public enum HookType : int
{
    WH_JOURNALRECORD = 0,
    WH_JOURNALPLAYBACK = 1,
    WH_KEYBOARD = 2,
    WH_GETMESSAGE = 3,
    WH_CALLWNDPROC = 4,
    WH_CBT = 5,
    WH_SYSMSGFILTER = 6,
    WH_MOUSE = 7,
    WH_HARDWARE = 8,
    WH_DEBUG = 9,
    WH_SHELL = …
Run Code Online (Sandbox Code Playgroud)

c# windows hook winforms kernel32

5
推荐指数
1
解决办法
458
查看次数

正确检测键盘布局

我有一个winforms应用程序,我需要获取用户的当前键盘布局.为此,我正在使用System.Windows.Forms.InputLanguage.CurrentInputLanguage.LayoutName.

只要用户将表单作为其活动窗口,一旦他将其他内容聚焦并更改了前一个属性不会返回正确值的语言,它就会正常工作,当表单仍然是活动窗口时,它将返回最后使用的语言.

是否有一种方法可以获得用户键盘布局的名称,即使他没有关注表单,对可以使用的内容没有任何限制.

c# keyboard layout keyboard-events winforms

4
推荐指数
1
解决办法
1778
查看次数