天天看點

WPF:Input and Commands輸入和指令(1)

CaptureUnCaptureMouse捕獲滑鼠

WPF:Input and Commands輸入和指令(1)

關注點:

1、 擷取 捕獲滑鼠按鈕的名字 的顯示

  1. 兩種方法:一是直接擷取GotMouseCapture路由事件中确定事件引發者e.source的名字
  2. 二是建立一個IInputElement,擷取滑鼠捕獲的元素Mouse.Captured;得到按鈕的引用即可
// GotMouseCapture event handler
// MouseEventArgs.source is the element that has mouse capture
private void ButtonGotMouseCapture(object sender, MouseEventArgs e)
{
    var source = e.Source as Button;

    if (source != null)
    {
        // Update the Label that displays the sample results.
        lblHasMouseCapture.Content = source.Name;
    }
    // Another way to get the element with Mouse Capture
    // is to use the static Mouse.Captured property.
    else
    {
        // Mouse.Capture returns an IInputElement.
        IInputElement captureElement;

        captureElement = Mouse.Captured;

        // Update the Label that displays the element with mouse capture.
        lblHasMouseCapture.Content = captureElement.ToString();
    }
}
           

2、 點選Capture Mouse按鈕時,使RaidoButton訓示的滑鼠 執行 被滑鼠捕獲狀态。此時滑鼠變大??就像滑鼠放于按鈕上狀态。。。答:根據按鈕上滑鼠捕獲定義,意味着捕獲滑鼠就是預設滑鼠在按鈕上拖移狀态。

private void OnCaptureMouseRequest(object sender, RoutedEventArgs e)
{
    Mouse.Capture(_elementToCapture);
}

private IInputElement _elementToCapture;

private void OnRadioButtonSelected(object sender, RoutedEventArgs e)
{
    var source = e.Source as RadioButton;

    if (source != null)
    {
        switch (source.Content.ToString())
        {
            case "1":
                _elementToCapture = Button1;
                break;
            case "2":
                _elementToCapture = Button2;
                break;
            case "3":
                _elementToCapture = Button3;
                break;
            case "4":
                _elementToCapture = Button4;
                break;
        }
    }
}
           

CommandSourceControlUsingSystemTime使用系統時間做比較值的指令源控件

WPF:Input and Commands輸入和指令(1)

1、實作效果

  1. 滑塊的滾動、點選的增減值設定
  2. 同步顯示目前時間秒數
  3. 執行指令綁定方法,及判斷指令查詢狀态

2、關鍵詞

  1. CommandBinding
  2. Slider.DecreaseSmall.Execute
  3. Timer.Elasped

3、靜态組織

window的指令綁定設定:

  1. Command綁定到window的一個靜态自定義路由指令
  2. 指令附加執行方法Executed,自定義方法附加到此句柄
  3. 指令能否執行CanExecute,附加判斷方法,傳回bool
<!-- Command Binding for the Custom Command -->
<Window.CommandBindings>
    <CommandBinding Command="{x:Static local:MainWindow.CustomCommand}"
                Executed="CustomCommandExecuted"
                CanExecute="CustomCommandCanExecute" />
</Window.CommandBindings>
           

完整滑塊狀态設定:

<Border BorderBrush="DarkBlue"
    BorderThickness="1"
    Height="75"
    Width="425">
    <StackPanel Orientation="Horizontal">
        <Button Command="Slider.DecreaseSmall"
        CommandTarget="{Binding ElementName=secondSlider}"
        Height="25"
        Width="25"
        Content="-"/>
        <Label VerticalAlignment="Center">0</Label>
        <Slider Name="secondSlider"
        Minimum="0"
        Maximum="60"
        Value="15"
        TickFrequency="5"
        Height="50"
        Width="275" 
        TickPlacement="BottomRight"
        LargeChange="5"
        SmallChange="5" 
        AutoToolTipPlacement="BottomRight" 
        AutoToolTipPrecision="0"
        MouseWheel="OnSliderMouseWheel"
        MouseUp="OnSliderMouseUp" />
        <Label VerticalAlignment="Center">60</Label>
        <Button Command="Slider.IncreaseSmall"
        CommandTarget="{Binding ElementName=secondSlider}"
        Height="25"
        Width="25"
        Content="+"/>
    </StackPanel>
</Border>
           

4、動态流程

設定計時器:顯示随時間秒數更新的時間數字

  1. 建立計時器類Timer,引發時間間隔事件Elapsed
  2. 設定時間間隔及激活計時器
  3. 線程排程執行同步委托
  4. Label顯示現在時間秒數,同時強制更新注冊指令狀态
// System Timer setup.
var timer = new Timer();
timer.Elapsed += timer_Elapsed;
timer.Interval = 1000;
timer.Enabled = true;

// System.Timers.Timer.Elapsed handler
// Places the delegate onto the UI Thread's Dispatcher
private void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    // Place delegate on the Dispatcher.
    Dispatcher.Invoke(DispatcherPriority.Normal,
        new TimerDispatcherDelegate(TimerWorkItem));
}

// Method to place onto the UI thread's dispatcher.
// Updates the current second display and calls 
// InvalidateRequerySuggested on the CommandManager to force the
// Command to raise the CanExecuteChanged event.
private void TimerWorkItem()
{
    // Update current second display.
    lblSeconds.Content = DateTime.Now.Second;

    // Forcing the CommandManager to raie the RequerySuggested event.
    CommandManager.InvalidateRequerySuggested();
}
           

判斷指令能否執行:

// CanExecute Event Handler.
//
// True if the current seconds are greater than the target value that is 
// set on the Slider, which is defined in the XMAL file.
private void CustomCommandCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    if (secondSlider != null)
    {
        e.CanExecute = DateTime.Now.Second > secondSlider.Value;
    }
    else
    {
        e.CanExecute = false;
    }
}
           

滑塊中輪滾動事件,引起滑塊值增減固定值

  1. 擷取滑塊引用
  2. 判斷滾動方向值,增減滑塊值Slider.DecreaseSmall.Execute
private void OnSliderMouseWheel(object sender, MouseWheelEventArgs e)
{
    var source = e.Source as Slider;
    if (source != null)
    {
        if (e.Delta > 0)
        {
            // Execute the Slider DecreaseSmall RoutedCommand.
            // The slider.value propety is passed as the command parameter.
            Slider.DecreaseSmall.Execute(
                source.Value, source);
        }
        else
        {
            // Execute the Slider IncreaseSmall RoutedCommand.
            // The slider.value propety is passed as the command parameter.
            Slider.IncreaseSmall.Execute(
                source.Value, source);
        }
    }
}
           

ps:此示例的e.Prameter為空,不顯示秒數。

ui