在《魔兽世界》中使用 Interface Options 插件的代码存在问题

我正在为一个现有的插件编写UI。或者更具体地说,我正在添加配置选项,尝试利用接口选项插件(IOA)面板。我一直在参考wowwiki,特别是讨论使用该面板的页面,但是更一般地说是一堆页面。

我遇到的问题肯定是由于我没有写插件的经验而导致的(我写了一些,但每次都是学习经验)。基本概念是:

-创建主面板-使用XML -为主面板中应该可见的事物(即全局选项)创建子项-使用XML -为每个子项目(配置类别)创建子面板-使用Lua(子面板的数量和名称是动态的) -为每个子面板创建子项目-使用Lua

能够工作的是:

-主面板显示在IOA面板中 -子面板显示在IOA面板中,作为主面板的子项 -我放在子面板上的纹理显示在它们上面

我遇到的问题是:

-如果将子面板创建为主面板的子项,它们会显示在主面板上方 -如果将子面板创建为UIParent的子项,它们将显示在主屏幕上(在IOA窗口未打开时可见) -我在XML文件中创建的任何子Frame作为主面板的子项都不会显示在上面

我目前的代码(缩短阅读量)在消息底部。任何帮助/建议将不胜感激。我知道代码部分有很多,但是我想尽可能清楚地说明我正在做什么。

请注意,我确实在官方的Warcraft UI论坛上发帖,但无法在那里获得任何帮助。

embeds.xml

...剪掉...
<Frame name="MyAddonFrame" parent="UIParent" hidden="false">
  <Scripts>
    <OnLoad>
      self:RegisterEvent("UNIT_TARGET");
      self:RegisterEvent("PLAYER_ENTERING_WORLD");
      MyAddon_OnLoad(self);
    </OnLoad>
    <OnEvent function="MyAddon_OnEvent" />
    </Scripts>

    <Frames>
      <Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">
        <Frames>
          <Button name="MyAddon_MacroSelectDropdownButton">
            <Anchors>
              <Anchor point="CENTER"/>
            </Anchors>

            <Scripts>
              <OnLoad>
                UIDropDownMenu_Initialize(this,
                MyAddon_MacroSelectDropdown_OnLoad);
              </OnLoad>
              <OnClick>
                MyAddon_MacroSelectDropdownButton_OnClick();
              </OnClick>
            </Scripts>
          </Button>
          <MessageFrame>
            <Anchors>
              <Anchor point="CENTER"/>
            </Anchors>
          <FontString text="Message Frame"/>
        </MessageFrame>
      </Frames>
    </Frame>
  </Frames>
</Frame>
...剪掉...

Lua Code

...剪掉...
function MyAddon_OnLoad(panel)
    MyAddon_CreateOptionsPanel(panel);
    MyAddon_ConsoleMessage("Loaded MyAddon: " .. tostring(panel));
end

function MyAddon_CreateOptionsPanel(panel)
    panel.name = "MyAddon " .. GetAddOnMetadata("MyAddon", "Version");  -- Set the name for the Category for the Panel
    panel.okay = function (self) MyAddonFrame_Close(); end;                 -- When the player clicks okay, run this function.
    panel.cancel = function (self)  MyAddonFrame_CancelOrLoad();  end;  -- When the player clicks cancel, run this function.
    InterfaceOptions_AddCategory(panel);                                    -- Add the panel to the Interface Options

    for name,text in pairs(ConfigData) do
        MyAddon_CreateMacroPanel(name, panel, panel.name);
    end
end

function MyAddon_CreateMacroPanel(macroName, parent, parentName)
    MyAddon_ConsoleMessage("Added macro option pane: " .. macroName);
    panel = CreateFrame( "Frame", "MyAddon_MacroPanel_" .. macroName, parent);
    panel.name = macroName;
    panel.parent = parentName;
    InterfaceOptions_AddCategory(panel);

    -- create a backdrop so we can see that the panel is created
    panel:SetFrameStrata("BACKGROUND");
    panel:SetWidth(128); -- Set these to whatever h

原文链接 https://stackoverflow.com/questions/2231312

点赞
stackoverflow用户714557
stackoverflow用户714557

是的,子框架默认情况下会覆盖它们的父级。这是一个基本原则。

我认为这里的不一致部分在于您假设需要将所有元素作为主框架的子元素添加。其实不是这样的。

对于两个独立的“面板”,即框架,您可以拥有:

<frame>...</frame>
<frame>...</frame>

如果第一个是您的“主框架”,或者是您打算接收插件主要事件(例如ADDON_LOADED)的框架,则第二个可以是其他内容,但仍然属于您。实际上,两者都不属于您,它们处于全局共享范围,所有插件都具有该范围。

因此,如果您想要与特定框架相关的可见元素(在位置和可见性方面),则它们应该是其子元素。否则,您应创建另一个框架。如果将父级隐藏,则其子级将被隐藏。如果移动父级,则其子级会移动,因为它们相对于父级具有相对位置。

这些是默认行为,但除非您确实需要做一些棘手的事情(例如真正的变形框架),否则最好遵循默认行为并创建单独的框架。


<Frame name="MyAddonFrame" parent="UIParent" hidden="false">
  <Scripts>
    <OnLoad>
      self:RegisterEvent("UNIT_TARGET");
      self:RegisterEvent("PLAYER_ENTERING_WORLD");
      MyAddon_OnLoad(self);
    </OnLoad>
    <OnEvent function="MyAddon_OnEvent" />
    </Scripts>

    <Frames>
      <Frame parent="MyAddonFrame" inherits="UIDropDownMenuTemplate">

您不需要像上面那样设置父级,但是如果您打算在事件之外的lua代码中引用该帧,则应为其命名:

    <Frames>
      <Frame name="$parentDropDownMenu" inherits="UIDropDownMenuTemplate">

如果这是在“embeds.xml”中,则技术上该文件是为嵌入在插件中的库的一组包含而设计的,而不是用于管理框架,但当然魔兽世界并不知道,所以它可以工作。代码应该更像是MyAddon.xml,MyAddon.lua


主要是需要创建正确大小的框架并将其注册为选项面板的一部分,这是它的要点解释。

请告诉我哪些还不清楚或无法使用。

2011-08-31 23:27:03