我试图模拟Windows UI手机中不存在的Android UI元素:ListPreference
我考虑使用Popup,它将完全占据整个屏幕(模拟模态窗口)。
因此弹出窗口将由以下元素组成:
弹出窗口 - >画布 - >边界 - > StackPanel - >单选按钮
“画布”将完全透明(或略微发白,以清楚地显示下面的元素不可用)
边界将被制作成仅包含所有RadioButton的大小 然后StackPanel将是不透明和黑色的。
不幸的是,如果我将底部画布设为透明,则所有子元素也都是透明的。我只能使元素更多透明。
透明度的工作方式与Android或iPhone略有不同(父母完全透明,但不透明的孩子很容易)。
有没有办法让父母完全透明,不透明的孩子?
或者也许有人可以提出另一种模拟模态窗口的方法。 谁知道,也许有人甚至开发了类似ListPreference的UIElement:)
谢谢
答案 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
也会更改子元素的不透明度。然后您的子元素可以具有您想要的任何不透明度。您可以将此控件作为子项添加到弹出窗口中。此外,您可以使用doubleanimation
和opened
事件触发器向弹出窗口添加closed
。将UserControl
的设计高度更改为480x760
以模拟整页。
回答你的问题。使用PhoneSemitransparentBrush
和TransparentBrush
等资源作为Canvas背景是您的选择之一。 Opacity
会改变整个UIElement
的不透明度,包括其子女。