Как отклонить всплывающее окно в Silverlight при нажатии за пределами управления?

В моем UI Silverlight у меня есть кнопка, которая при нажатии открывается управление с некоторыми параметрами фильтрации. Я хотел бы, чтобы это управление спряталось, когда Вы нажимаете за пределами него. Другими словами, это должно функционировать способом, подобным полю комбинированного списка, но это не поле комбинированного списка (Вы не выбираете объект в нем). Вот то, как я пытаюсь получить щелчок за пределами управления для отклонения его:

public partial class MyPanel : UserControl
{
    public MyPanel()
    {
        InitializeComponent();
    }

    private void FilterButton_Click(object sender, RoutedEventArgs e)
    {
        // Toggle the open state of the filter popup
        FilterPopup.IsOpen = !FilterPopup.IsOpen;
    }

    private void UserControl_Loaded(object sender, RoutedEventArgs e)
    {
        // Capture all clicks and close the popup
        App.Current.RootVisual.MouseLeftButtonDown += delegate {
            FilterPopup.IsOpen = false; };
    }
}

К сожалению, обработчик событий для MouseLeftButtonDown никогда не становится запущенным. Существует ли известный способ сделать раскрывающееся управление, которое автоотклоняет, когда Вы нажимаете за пределами него? В противном случае, почему мой не MouseLeftButtonDown увольнение обработчика?

Решение:

Я думал, что отправлю свое все решение в случае, если другие находят это полезным. На моем визуальном верхнем уровне я объявляю "щит" для всплывающих окон, как это:

<UserControl xmlns:my="clr-namespace:Namespace"
    x:Class="Namespace.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation" 
    xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
>
  <Grid Background="Black" HorizontalAlignment="Stretch" 
          VerticalAlignment="Stretch">
    <my:MyStuff/>
    <Canvas HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
            x:Name="PopupShield" Background="Transparent" Width="Auto" 
            Height="Auto" Visibility="Collapsed"/>
  </Grid>
</UserControl>

Затем я добавил дополнительный метод для Popup класс, как это:

public static class PopupUtils
{
    public static void MakeAutoDismissing(this Popup popup)
    {
        var shield = (App.Current.RootVisual as MainPage).PopupShield;

        // Whenever the popup opens, deploy the shield
        popup.HandlePropertyChanges(
            "IsOpen",
            (s, e) =>
            {
                shield.Visibility = (bool)e.NewValue 
                    ? Visibility.Visible : Visibility.Collapsed;
            }
        );

        // Whenever the shield is clicked, dismiss the popup
        shield.MouseLeftButtonDown += (s, e) => popup.IsOpen = false;
    }
}

public static class FrameworkUtils
{
    public static void HandlePropertyChanges(
        this FrameworkElement element, string propertyName, 
        PropertyChangedCallback callback)
    {
        //Bind to a depedency property
        Binding b = new Binding(propertyName) { Source = element };
        var prop = System.Windows.DependencyProperty.RegisterAttached(
            "ListenAttached" + propertyName,
            typeof(object),
            typeof(UserControl),
            new System.Windows.PropertyMetadata(callback));

        element.SetBinding(prop, b);
    }
}

Дополнительный метод используется как это:

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    FilterPopup.MakeAutoDismissing();
}
22
задан Jacob 24 February 2010 в 22:15
поделиться

3 ответа

Вы установили цвет фона на вашем RootVisual?

4
ответ дан 29 November 2019 в 05:51
поделиться

При первом щелчке мыши вызовите метод CaptureMouse () элемента управления. Затем вызовите ReleaseMouseCapture () при втором щелчке.

1
ответ дан 29 November 2019 в 05:51
поделиться

Я не использовал MySql около 6 месяцев (к счастью, перенесен на Sql Server), но, попробуйте изменить символы @ для?, как будто память служит, это правильное соглашение с MySql, так что:

MySqlCommand cmdAdd = new MySqlCommand(
       "INSERT INTO Faults (FaultGroup, Text, Date, IP)"
       + " VALUES (?FaultGroup, ?Text, ?Date, ?IP)",
       conn);

MySqlParameter paramFaultGroup = new MySqlParameter("?FaultGroup", MySqlDbType.Int32);
FaultsGroup faultsGroup = (FaultsGroup) Enum.Parse(typeof (FaultsGroup), myFault.FaultGroup);
paramFaultGroup.Value = (int) faultsGroup;
cmdAdd.Parameters.Add(paramFaultGroup);

cmdAdd.ExecuteNonQuery();
-121--5044239-

Есть крошечная производительность попадание на вставки, обновления и удаления Для отдельной записи это, как правило, будет настолько незначительным, что будет незаметным, если только вы не начнете иметь нелепое количество FK, связанных с таблицей (ясно, что проверка 100 других таблиц занимает больше времени, чем 2). Это хорошая и неплохая вещь, поскольку базы данных без целостности не заслуживают доверия и поэтому бесполезны. Не стоит торговать честностью ради скорости. Это снижение производительности обычно компенсируется лучшей способностью оптимизировать планы выполнения.

У нас есть база данных среднего размера с примерно 9 миллионами записей и FK везде, где они должны быть, и редко замечаем попадание производительности (за исключением одной плохо разработанной таблицы, которая имеет более 100 внешних ключей, это немного медленно удалить записи из этого, так как все должны быть проверены). Почти все dba, кого я знаю, кто имеет дело с большими, терабайтными базами данных, и истинная потребность в высокой производительности больших наборов данных настаивает на ограничениях внешнего ключа, потому что целостность является ключом к любой базе данных. Если люди с базами данных размером терабайта могут позволить себе очень небольшую производительность, то и вы можете.

FK не индексируются автоматически, и если они не индексируются, это может привести к проблемам с производительностью.

Честно говоря, я бы взял копию вашей базы данных, добавил правильно проиндексированные FK и показал разницу во времени для вставки, удаления, обновления и выбора из этих таблиц в сравнении с тем же из вашей базы данных без FK. Показать, что вы не будете вызывать сбой производительности. Затем отобразите результаты запросов, которые показывают потерянные записи, которые больше не имеют значения, так как PK, с которым они связаны, больше не существует. Особенно эффективно показать это для таблиц, которые содержат финансовую информацию («У нас 2700 заказов, которые мы не можем связать с клиентом» заставит руководство сидеть и принимать во внимание).

-121--1278842-

Один из способов - поместить свой контроль на прозрачный холст, которое заполняет всю поверхность Silverlight. При щелчке холста закройте холст и элемент управления. Важно убедиться, что для фоновой кисти холста установлено значение «Прозрачный», если вы хотите получать события мыши.

Альтернативным методом, с которым у меня не было успеха, является использование захвата мыши в Silverlight и обнаружение того, когда мышь нажата вне всплывающего окна.

5
ответ дан 29 November 2019 в 05:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: