Прозрачный холст, с непрозрачными элементами - PullRequest
1 голос
/ 23 ноября 2011

Я пытаюсь смоделировать элемент пользовательского интерфейса Android, которого, к сожалению, нет в телефоне Windows 7: ListPreference

Я думал об использовании всплывающего окна, которое заняло бы ровно весь экран (для имитации модального окна).

Таким образом, всплывающее окно будет состоять из следующих элементов:

Всплывающее окно -> Холст -> Граница -> StackPanel -> Радиокнопки

Холст будет полностью прозрачным (или слегка беловатым, чтобы ясно показать, что элемент под ним недоступен)

Граница будет сделана так, чтобы она была достаточно большой, чтобы вместить все кнопки RadioButton. Тогда StackPanel будет непрозрачным и черным.

К сожалению, если я сделаю нижний холст прозрачным, все дочерние элементы также будут прозрачными. Я могу только сделать элементы больше прозрачными.

Способ прозрачности работает немного иначе, чем в Android или iPhone (где довольно просто иметь родительский полностью прозрачный, но непрозрачный дочерний элемент).

Есть ли способ сделать родителя полностью прозрачным с непрозрачными для детей?

Или, может быть, кто-то может предложить другой способ имитации модального окна. Кто знает, может быть, кто-то даже разработал ListPreference-подобный UIElement:)

Спасибо

Ответы [ 2 ]

2 голосов
/ 29 ноября 2011

Вот как я это сделал.

Он работает аналогично ListPreference на Android. Конструктор принимает строку, массив строк и целое число, указывающее, какое значение по умолчанию

Когда окна закрыты, уволенный делегат называется ..

Так вы называете это так:

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 голос
/ 23 ноября 2011

Я бы предложил создать Usercontrol, который бы делал то, что вам нужно.Установите background для сетки *1003* на PhoneSemitransparentBrush, или изменение opacity также изменит непрозрачность дочернего элемента.Тогда ваши дочерние элементы могут иметь любую непрозрачность, какую захотите.Вы можете добавить этот элемент управления как дочерний элемент во всплывающее окно.Кроме того, вы можете добавить doubleanimation во всплывающее окно с помощью триггеров событий opened и closed.Измените высоту дизайна UserControl на 480x760 для имитации полной страницы.

Чтобы ответить на ваш вопрос.Использование таких ресурсов, как PhoneSemitransparentBrush и TransparentBrush для фона Canvas, является одним из ваших вариантов.Opacity изменит непрозрачность всего UIElement, включая его дочерние элементы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...