CaptureUnCaptureMouse捕獲滑鼠
關注點:
1、 擷取 捕獲滑鼠按鈕的名字 的顯示
- 兩種方法:一是直接擷取GotMouseCapture路由事件中确定事件引發者e.source的名字
- 二是建立一個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使用系統時間做比較值的指令源控件
1、實作效果
- 滑塊的滾動、點選的增減值設定
- 同步顯示目前時間秒數
- 執行指令綁定方法,及判斷指令查詢狀态
2、關鍵詞
- CommandBinding
- Slider.DecreaseSmall.Execute
- Timer.Elasped
3、靜态組織
window的指令綁定設定:
- Command綁定到window的一個靜态自定義路由指令
- 指令附加執行方法Executed,自定義方法附加到此句柄
- 指令能否執行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、動态流程
設定計時器:顯示随時間秒數更新的時間數字
- 建立計時器類Timer,引發時間間隔事件Elapsed
- 設定時間間隔及激活計時器
- 線程排程執行同步委托
- 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;
}
}
滑塊中輪滾動事件,引起滑塊值增減固定值
- 擷取滑塊引用
- 判斷滾動方向值,增減滑塊值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為空,不顯示秒數。