none
Hosting eines WPF-Forms in einem PropertyGrid (UITypeEditor) RRS feed

  • Frage

  • Salü zäme
    Ich habe ein PropertyGrid in dem ich Attribute mit einem UITypeEditor in Detail-Steuerelementeanzeigen anzeigen und erfassen kann. Natürlich sind diese Details-Steuerelement in Forms geschrieben, da ja dieses PropertyGrid bzw. der UITypeEditor auf Forms ausgelegt ist.
    Meine Frage: Weiss jemand, ob es möglich ist, an Stelle von Forms Steuerelementen auch WPF-Steuerelemente zu verwenden? Ich stelle mir vor, dass dieses Steuerelement in irgend einer Form mit Windows.Forms.Integration in Forms verwandelt werden müssten. Aber wie....

    Kennt sich da jemand aus??
    Jakob Brunner


    Jakob Brunner, Switzerland
    Mittwoch, 24. November 2010 13:02

Antworten

  • ... so, habe es selber hingekriegt. Und damit auch der profitieren kann, der das gleiche Problem vor sich hat, hier meine Lösung.

    Das Control "WinkelPicker" ist ein WPF-Steuerelement.

      public class classWinkelEditor : UITypeEditor
      {
        private WinkelPicker ui = new WinkelPicker();
        private ElementHost _oHost = new ElementHost();
        private double _mMaximum = (new WinkelSpan(359, 59, 59)).Winkel;
        private double _mMinimum = (new WinkelSpan(-359, 59, 59)).Winkel;
    
        public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
          //Get the Editor-Service
          IWindowsFormsEditorService edSev = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
    
          //Create our Hosting-UI
          if (this._oHost.Child == null || this.ui == null)
          {
            this._oHost = new ElementHost();
            ui = new WinkelPicker();
            ui.Maximum = this._mMaximum;
            ui.Minimum = this._mMinimum;
            this._oHost.Child = this.ui;
            this._oHost.Dock = DockStyle.Fill;
            this._oHost.Height = 23;
          }
    
          //Initialisierung the ui with the Settings for this value
          ((WinkelPicker)this._oHost.Child).Winkel = (double)value;
          //instruct the editor service to display the control as a droptown
          edSev.DropDownControl(this._oHost);
    
          //Return the update Value
          return ((WinkelPicker)this._oHost.Child).Winkel;
        }
    
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
          if (context != null)
          {
            AttributeCollection atts = context.PropertyDescriptor.Attributes;
            MaxValueAttribute att = atts[typeof(MaxValueAttribute)] as MaxValueAttribute;
            if (att != null)
            {
              this._mMaximum = att.Maximum;
              this._mMinimum = att.Minimum;
            }
          }
    
          // We're using a drop down style UITypeEditor.
          return UITypeEditorEditStyle.DropDown;
        }
      }
    

    Jakob Brunner, Switzerland
    • Als Antwort markiert Jakob.Brunner Freitag, 26. November 2010 08:33
    Freitag, 26. November 2010 08:32