透明帆布,不透明元素

时间:2011-11-23 10:17:07

标签: c# silverlight windows-phone-7

我试图模拟Windows UI手机中不存在的Android UI元素:ListPreference

我考虑使用Popup,它将完全占据整个屏幕(模拟模态窗口)。

因此弹出窗口将由以下元素组成:

弹出窗口 - >画布 - >边界 - > StackPanel - >单选按钮

“画布”将完全透明(或略微发白,以清楚地显示下面的元素不可用)

边界将被制作成仅包含所有RadioButton的大小 然后StackPanel将是不透明和黑色的。

不幸的是,如果我将底部画布设为透明,则所有子元素也都是透明的。我只能使元素更多透明。

透明度的工作方式与Android或iPhone略有不同(父母完全透明,但不透明的孩子很容易)。

有没有办法让父母完全透明,不透明的孩子?

或者也许有人可以提出另一种模拟模态窗口的方法。 谁知道,也许有人甚至开发了类似ListPreference的UIElement:)

谢谢

2 个答案:

答案 0 :(得分:2)

以下是我最终如何做到这一点。

它的工作方式与Android上的ListPreference类似。构造函数接受一个字符串,一个字符串数组和一个int,指示哪个是默认值

当窗口关闭时,代表Dismissed被调用..

所以你这样称呼它:

string[] choices = { "Choice 1", "Choice 2", "Choice3" };
ListPreference lp = new ListPreference("name", choices, 1);
lp.dismissed += new ListPreferences.DismissedHandler(lp_Dismissed);

代码:

public class ListPreference
{
    Popup p;
    string Name;
    int oldValue;

    public delegate void DismissedHandler(string name, bool changed, int newvalue);

    public event DismissedHandler Dismissed;

    public bool IsOpen
    {
        get
        {
            return p.IsOpen;
        }

        set
        {
            p.IsOpen = value;
        }
    }

    public ListPreference(string name, Array elements, int default_value)
    {
        p = new Popup();
        Name = name;
        Dismissed = null;
        oldValue = default_value;

        double height = (App.Current.RootVisual as FrameworkElement).ActualHeight;
        double width = (App.Current.RootVisual as FrameworkElement).ActualWidth;

        p.VerticalOffset = SystemTray.IsVisible ? 32.0 : 0.0;
        p.Height = height;
        p.Width = width;
        Canvas canvas = new Canvas();
        SolidColorBrush colorBrush = new SolidColorBrush(Colors.Black);
        colorBrush.Opacity = 0.75;
        //Color.FromArgb(0xff, 0x8a, 0x8a, 0x8a));
        canvas.Background = colorBrush;
        //canvas.Opacity = 0.765;
        canvas.Height = height;
        canvas.Width = width;
        p.Child = canvas;

        Border border = new Border();
        border.Width = width - 50.0 * 2.0;
        border.BorderBrush = new SolidColorBrush(Colors.LightGray);
        border.BorderThickness = new Thickness(5.0);
        border.Background = new SolidColorBrush(Colors.Black);
        canvas.Children.Add(border);

        StackPanel panel2 = new StackPanel();
        panel2.Orientation = System.Windows.Controls.Orientation.Vertical;

        int i = 0;
        foreach (string val in elements)
        {
            RadioButton radio1 = new RadioButton();
            radio1.GroupName = "group1";
            radio1.Content = val;
            if (i == default_value)
                radio1.IsChecked = true;
            int j = i;
            radio1.Click += (sender, args) => radio1_Checked(radio1, j);
            i++;
            panel2.Children.Add(radio1);
        }

        Button button1 = new Button();
        button1.Background = new SolidColorBrush(Colors.Black);
        button1.Foreground = new SolidColorBrush(Colors.White);
        button1.Opacity = 1.0;
        button1.Content = "Cancel";
        button1.Margin = new Thickness(5.0);
        button1.Click += new RoutedEventHandler(closeButton_Click);
        panel2.Children.Add(button1);
        border.Child = panel2;

        // Open the popup.
        p.IsOpen = true;
        p.UpdateLayout();
        border.Height = panel2.DesiredSize.Height + 5.0 * 2.0;
        border.SetValue(Canvas.TopProperty, (height - border.Height) / 2.0);
        border.SetValue(Canvas.LeftProperty, (width - border.Width) / 2.0);
        p.UpdateLayout();
    }

    void closeButton_Click(object sender, RoutedEventArgs e)
    {
        // Close the popup.
        p.IsOpen = false;
        if (Dismissed != null)
        {
            Dismissed(Name, false, -1);
        }
    }

    void radio1_Checked(object sender, int idx)
    {
        p.IsOpen = false;
        if (Dismissed != null)
        {
            Dismissed(Name, idx != oldValue, idx);
        }
    }
}

答案 1 :(得分:1)

我建议创建一个Usercontrol来做你需要的。将LayoutRoot网格的background设置为PhoneSemitransparentBrush或更改opacity也会更改子元素的不透明度。然后您的子元素可以具有您想要的任何不透明度。您可以将此控件作为子项添加到弹出窗口中。此外,您可以使用doubleanimationopened事件触发器向弹出窗口添加closed。将UserControl的设计高度更改为480x760以模拟整页。

回答你的问题。使用PhoneSemitransparentBrushTransparentBrush等资源作为Canvas背景是您的选择之一。 Opacity会改变整个UIElement的不透明度,包括其子女。