General XMetaL Discussion

XMetaL Community Forum General XMetaL Discussion Is it possible to update CSS programmatically in C#?

  • wksim

    Is it possible to update CSS programmatically in C#?

    Participants 0
    Replies 1
    Last Activity 10 years, 11 months ago

    XMetaL version: 6.1
    VS: 2010

    I have a style defined for an element in the CSS file, and I would like to change the display property to “none” from “inline” and visa versa in C# if possible. Is there a way to do this? I was thinking I may be able to do this using DOMCSSRule object, but I am getting an exception:

      XMetaL.DOMCSSStyleSheet css = cssList.item(i);
      XMetaL.DOMCSSRuleList ruleList = css.cssRules;
      for (int j = 0; j < ruleList.length; j++)
          XMetaL.DOMCSSRule rule = ruleList.item(j);  // –> I am getting an exception here.

    Exception is:

    Unable to cast COM object of type 'System.__ComObject' to interface type 'XMetaL.DOMCSSRule'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{2C01DB30-A999-4636-9322-6846ED8B71F5}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).


    Derek Read

    Reply to: Is it possible to update CSS programmatically in C#?

    There are currently three strategies for modifying CSS that I can think of. Which you use will depend on your needs:

    1. Swap the currently loaded CSS file on disk with your modified version (how this is done with any particular language will vary but the easiest way is to have both files in the same folder with different names and then simply rename them so that the CSS file you wish to use matches yourDTDname.css) then call the API Document_object.RefreshCssStyle(). Note that this method will cause the entire document to be reformatted, causing the user's selection to be lost (you may use various strategies to handle that, including inserting a temporary PI to remember the current position, then moving the selection after the API call, then removing the PI at the end).

    2. Use new APIs available in the 6.0 releases. See my post here:,594.msg1911.html#msg1911
    This is similar to #1 except that it avoids the need to swap files on disk.

    3. Set the property Selection.ContainerStyle for a particular node. This will affect one node only (this is different from using a CSS selector that may match one or more nodes in a document, and remains in effect only as long as the document remains open in Tags On or Normal views).


  • You must be logged in to reply to this topic.

Lost Your Password?