如何为SWT WPF程序添加主题?

时间:2012-03-16 16:48:00

标签: java wpf swt

我想在我的java应用程序的Windows版本上使用WPF。我发现使用SWT很容易做到这一点,它也支持SWT元素的wpf ResourceDictionary XAML(please see this)。 SWT WPF实现对我很有用,但我无法找到如何将WPF theme放在上面。某些SWT小部件org.eclipse.swt.widgets.Button具有setData方法,但其中一些像org.eclipse.swt.widgets.Display那样没有这种方法。 setDate上的shell方法也不会在整个窗口上设置主题。

那么如何为SWT WPF程序的整个窗口添加主题?

以下是示例代码:

import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.MenuItem;

public class MainForm {

    protected Shell shell;

    public static void main(String[] args) {
        try {
            MainForm window = new MainForm();
            window.open();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void open() {
        Display display = Display.getDefault();
        createContents();
        shell.open();
        shell.layout();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    protected void createContents() {
        shell = new Shell();
        shell.setData(
                "ResourceDictionary",
                "ExpressionDark.xaml");
        // theme not applied on entire window, just buttons

        shell.setSize(450, 300);
        shell.setText("Window Title");

        Button button = new Button(shell, SWT.FLAT);
        button.setText("Button");
        button.setSize(250, 50);
        button.setBounds(0, 50, 250, 50);

        Menu menu = new Menu(shell, SWT.BAR);
        shell.setMenuBar(menu);

        MenuItem mntmNewSubmenu = new MenuItem(menu, SWT.CASCADE);
        mntmNewSubmenu.setText("New SubMenu");

        Menu menu_1 = new Menu(mntmNewSubmenu);
        mntmNewSubmenu.setMenu(menu_1);

    }
}

2 个答案:

答案 0 :(得分:1)

SWT WPF is no longer supported.所以最好不要使用。

答案 1 :(得分:0)

我必须承认我没有使用SWT WPF,所以这可能根本不起作用,但如果您使用的是标准WPF,这通常会做什么

<Window 
    ....
    ....
    ....
    ResizeMode="CanResizeWithGrip"
    Template="{StaticResource WindowTemplateKey}">
</Window>

你将拥有类似这样的模板

<!-- Custom Window : to allow repositioning of ResizeGrip-->
<ControlTemplate x:Key="WindowTemplateKey" TargetType="{x:Type Window}">
    <Border Background="{TemplateBinding Background}" 
            BorderBrush="{TemplateBinding BorderBrush}" 
            BorderThickness="{TemplateBinding BorderThickness}">
        <Grid>
            <AdornerDecorator>
                <ContentPresenter/>
            </AdornerDecorator>
            <ResizeGrip Visibility="Collapsed" 
                        HorizontalAlignment="Right" x:Name="WindowResizeGrip" 
                        Style="{DynamicResource ResizeGripStyle1}" 
                        VerticalAlignment="Bottom" IsTabStop="false"/>
        </Grid>
    </Border>
    <ControlTemplate.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="ResizeMode" Value="CanResizeWithGrip"/>
                <Condition Property="WindowState" Value="Normal"/>
            </MultiTrigger.Conditions>
            <Setter Property="Visibility" 
                 TargetName="WindowResizeGrip" Value="Visible"/>
        </MultiTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

所以我想你提供了一个Window(在你的情况下,在一个单独的ResourceDictionary(XAML文件)中指定Shell,称为&#34; CustomShellTemplateFile.xaml&#34;)你可以做类似的事情

shell.setData(                 &#34;的ResourceDictionary&#34 ;,                 &#34; CustomShellTemplateFile.xaml&#34);