none
Как вывести textbox для ввода длины линии в процессе ее рисования мышкой приблизительно так как это сделано в autocad. RRS feed

  • Вопрос

  • Рисую линию при помощи directx в  самописном wpf контроле, пытаюсь реализовать ввод длины линии в tooltip-е появляющемся при нажатии левой кнопки мыши в области рисования, но tooltip появляется при переходе указателя  мыши в область рисования и исчезает при перемещении мыши. Вот xaml интерфейса:

    <d2d:Direct2DControl.ToolTip> <Win:ToolTipEx x:Name="m_toolTip" ToolTipService.InitialShowDelay="0" ToolTipService.BetweenShowDelay="0" IsReallyOpen="False" IsOpen="False" VerticalOffset="{Binding Path=Y,UpdateSourceTrigger=PropertyChanged}" HorizontalOffset="{Binding Path=X,UpdateSourceTrigger=PropertyChanged}" Placement="Custom" >

    </Win:ToolTipEx> </d2d:Direct2DControl.ToolTip>


    Код вызываемый по нажатию левой кнопки мыши(faHandle=) и отпусканию левой кнопки мыши

     private void Handle(string faHandle)
            {
    
                if (faHandle == "true")
                {
                    ((ToolTipEx)d2DControl.ToolTip).IsOpen = true;
                    ((ToolTipEx)d2DControl.ToolTip).StaysOpen = true;
    
                }
                else
                {
                    ((ToolTipEx)d2DControl.ToolTip).IsOpen = false;
                   // ((ToolTipEx)d2DControl.ToolTip).StaysOpen = false;
    
                }
        }

    Вот код переопределенного типа Tooltip
      public class ToolTipEx : ToolTip
        {
            static ToolTipEx()
            {
                IsReallyOpenProperty =
                    DependencyProperty.Register(
                        "IsReallyOpen",
                        typeof(bool),
                        typeof(ToolTipEx),
                        new FrameworkPropertyMetadata(
                            defaultValue: false,
                            flags: FrameworkPropertyMetadataOptions.None,
                            propertyChangedCallback: StaticOnIsReallyOpenedChanged));
            }
    
            public static readonly DependencyProperty IsReallyOpenProperty;
    
            protected static void StaticOnIsReallyOpenedChanged(
                DependencyObject o, DependencyPropertyChangedEventArgs e)
            {
                ToolTipEx self = (ToolTipEx)o;
                self.OnIsReallyOpenedChanged((bool)e.OldValue, (bool)e.NewValue);
            }
    
            protected void OnIsReallyOpenedChanged(bool oldValue, bool newValue)
            {
                this.IsOpen = newValue;
            }
    
            public bool IsReallyOpen
            {
                get
                {
                    bool b = (bool)this.GetValue(IsReallyOpenProperty);
                    return b;
                }
                set { this.SetValue(IsReallyOpenProperty, value); }
            }
    
            protected override void OnClosed(RoutedEventArgs e)
            {
                System.Diagnostics.Debug.Print(String.Format(
                    "OnClosed: IsReallyOpen: {0}, StaysOpen: {1}", this.IsReallyOpen, this.StaysOpen));
                if (this.IsReallyOpen && this.StaysOpen)
                {
                    e.Handled = true;
                    // We cannot set this.IsOpen directly here.  Instead, send an event asynchronously.
                    // DispatcherPriority.Send is the highest priority possible.
                    Dispatcher.CurrentDispatcher.BeginInvoke(
                        (Action)(() => this.IsOpen = true),
                        DispatcherPriority.Send);
                }
                else
                {
                    base.OnClosed(e);
                }
            }
        }




Ответы

Все ответы