有人可以给我一个提示,在我们说 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
干杯!