0

有人可以给我一个提示,在我们说 PickObject 命令之后,如何让我的 WPF 窗口再次处于活动状态?

xaml_source = "UI.xaml"
class ModelessForm(WPFWindow):
    
    def __init__(self, xaml_source, literal_string=False, handle_esc=True, set_owner=True):
        """Initialize WPF window and resources."""
        # load xaml
        self.load_xaml(
            xaml_source,
            literal_string=literal_string,
            handle_esc=handle_esc,
            set_owner=set_owner
            )
        self.datagrid.ItemsSource = data_grid_content
        self.Show()
        
    def load_xaml(self, xaml_source, literal_string=False, handle_esc=True, set_owner=True):
        # create new id for this window
        self.window_id = coreutils.new_uuid()

        if not literal_string:
            if not op.exists(xaml_source):
                wpf.LoadComponent(self,os.path.join(EXEC_PARAMS.command_path,xaml_source))
            else:
                wpf.LoadComponent(self, xaml_source)
        else:
            wpf.LoadComponent(self, framework.StringReader(xaml_source))

        # set properties
        self.thread_id = framework.get_current_thread_id()
        if set_owner:
            self.setup_owner()
        self.setup_icon()
        WPFWindow.setup_resources(self)
        if handle_esc:
            self.setup_default_handlers()
            
    def setup_owner(self):
        wih = Interop.WindowInteropHelper(self)
        wih.Owner = AdWindows.ComponentManager.ApplicationWindow
        
    def on_enter(self, sender, e):
        if e.Key == Input.Key.Enter:
            self.pickElementClick
            # wih = Interop.WindowInteropHelper(self)
            
            # wih.Owner = AdWindows.ComponentManager.ApplicationWindow
            # print (wih.Owner)
            # # wih.Owner = self.uiapp.MainWindowHandle
            # # print (AdWindows.ComponentManager.ApplicationWindow)
            # hwnd_source = Interop.HwndSource.FromHwnd(HOST_APP.proc_window)
            # # print (hwnd_source)
            # root_visual = hwnd_source.RootVisual
            # print (root_visual)
            # Common.User32.SetForegroundWindow( IntPtr(AdWindows.ComponentManager.ApplicationWindow))
            
            # uiapp=HOST_APP.uiapp
            # wndHndle = uiapp.MainWindowHandle
            # print (wndHndle)
            # # print ('/n')
            # wih = Interop.WindowInteropHelper(self)
            # # print (wih)
            # # wih.Owner = AdWindows.ComponentManager.ApplicationWindow
            # print (wih.Owner)
            #SetWindowLongPtr(wih, -8, wndHndle)

对于选择元素,我使用来自 pyRevitMEP 的 Customized_event,它要求用户一个一个地选择两个元素。

或多或少看起来像这样。


el_ref1 = uidoc.Selection.PickObject(
        ObjectType.LinkedElement, "Select element in linked Revit model")

el_ref2 = uidoc.Selection.PickObject(
        ObjectType.Element, "Select element in current Revit model")

#HANDLER in class ModelessForm(WPFWindow):
def pickElementClick(self, sender, e):
        try:
            customizable_event.raise_event(
                pick_elements, _parameterSet_global_1, _parameterSet_global_2
            )
            
        except:
            pass
        
        self.datagrid.Items.Refresh()

选择完成后,除了我的 WPF 窗口处于非活动状态之外,一切都像魅力一样。我显然可以点击它并激活 - 没问题,但目标是使用 on_enter 事件处理程序再次点击 enter 并启动命令

def on_enter(self, sender, e):
    if e.Key == Input.Key.Enter:
        self.pickElementClick

这让我只需按 Enter 键并做出新的选择。

其中def on_enter(self, sender, e):有很多未使用的代码。我尝试了很多事情,但不幸的是失败了:D

干杯!

4

0 回答 0