2013-12-05 4 views
1

Я пытаюсь создать пользовательский набор цветов, который наследуется от ComboBox.ComboBox избежать всплывающих окон закрыть

Это скриншот.

screenshot

Как вы можете видеть, это просто очень нормальный интерфейс выбора цвета.

До сих пор почти все в порядке, кроме проблемы, которую я пишу на скриншоте.

Я могу перетащить ползунок спектра, ползунки RGBA и без проблем нажать эти 2 кнопки.

Если я нахожу пустое пространство внутри ComboBoxItem, всплывающее окно disppears, это также поведение, которое мне нужно, и оно работает.

Вот коды площади для холста.

XAML

<Canvas x:Name="colorPlatte" Width="175" Height="150" Grid.Row="0" Grid.Column="0" Margin="4" MouseLeftButtonDown="colorPlatte_MouseLeftButtonDown" MouseLeftButtonUp="colorPlatte_MouseLeftButtonUp" MouseMove="colorPlatte_MouseMove"> 
       <Rectangle x:Name="ColorShadingRectangle" 
          Height="{Binding ElementName=colorPlatte, Path=Height}" 
          Width="{Binding ElementName=colorPlatte, Path=Width}" 
          Fill="{Binding ElementName=sliderSpectrum, Path=SelectedColor, Converter={StaticResource ColorToSolidBrush}}"/> 
       <Rectangle x:Name="WhiteGradient" Width="{Binding ElementName=colorPlatte,Path=Width}" Height="{Binding ElementName=colorPlatte,Path=Height}"> 
        <Rectangle.Fill> 
         <LinearGradientBrush StartPoint="0,0" EndPoint="1,0"> 
          <GradientStop Offset="0" Color="#ffffffff" /> 
          <GradientStop Offset="1" Color="Transparent" /> 
         </LinearGradientBrush> 
        </Rectangle.Fill> 
       </Rectangle> 
       <Rectangle x:Name="BlackGradient" Width="{Binding ElementName=colorPlatte,Path=Width}" Height="{Binding ElementName=colorPlatte,Path=Height}"> 
        <Rectangle.Fill> 
         <LinearGradientBrush StartPoint="0,1" EndPoint="0, 0"> 
          <GradientStop Offset="0" Color="#ff000000" /> 
          <GradientStop Offset="1" Color="#00000000" /> 
         </LinearGradientBrush> 
        </Rectangle.Fill> 
       </Rectangle> 

       <Canvas x:Name="colorSelector" Width="12" Height="12" IsHitTestVisible="False"> 
        <Ellipse Width="12" Height="12" StrokeThickness="3" Stroke="#FFFFFFFF" IsHitTestVisible="False" /> 
        <Ellipse Width="12" Height="12" StrokeThickness="1" Stroke="#FF000000" IsHitTestVisible="False" /> 
       </Canvas> 
      </Canvas> 

Code-за связанными с холстом

private void colorPlatte_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     Point p = e.GetPosition(colorPlatte); 
     UpdateColorSelectorPosColor(p); 
     colorPlatte.CaptureMouse(); 
    } 

    private void colorPlatte_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      Point p = e.GetPosition(colorPlatte); 
      UpdateColorSelectorPosColor(p); 
      Mouse.Synchronize(); 
     } 
    } 

    private void colorPlatte_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     colorPlatte.ReleaseMouseCapture(); 
    } 

Итак, как я должен предотвратить всплывающее окно закрывается после пользователя перетаскивает выбор цвета?

Спасибо.

Edit: 12/6

Извините за не дескрипты моего вопроса четко и пропустить досточно, предыдущий кадр был взят в режиме конструктора непосредственно и может игнорировать слишком много.

ColorPicker2

я не должен сказать наследовать от ComboBox, то ColorPicker на самом деле UserControl, и я помещаю его в baseComboBoxItem (унаследует от ComboBoxItem), который под baseComboBox (наследуется от ComboBox)

Когда пользователь щелкните ComboBox, только один элемент в всплывающем меню (ColorPicker), чтобы пользователь мог выбрать цвет.

Но если пользователь перетащит селектор цвета (см. Предыдущий скриншот), это приведет к автоматическому закрытию всплывающего окна ComboBox (выпадающего списка?).

Мой вопрос: как мне сделать, чтобы всплывающее окно открылось после того, как пользователь перетащил селектор цветов (после запуска пользователем события MouseLeftButtonUp)?

+0

Это не 'ComboBox'. Не наследуйте от 'ComboBox', если вам не нужны функции, предоставляемые им. 'ComboBox' является' ItemsControl'. Я не вижу никаких элементов в пользовательском интерфейсе. –

+0

Пожалуйста, проверьте мои вопросы обновления – Fishman

+0

Woah! +1 для обширного вопроса с фотографиями и т. Д. Ницца! –

ответ

1

Я думаю, что если вы хотите это сделать (и используйте combobox), вы должны установить весь шаблон combobox (described here), а во всплывающем меню StayOpen - True.

Но, как комментировал HighCore, вам действительно не нужен combobx.

Вы должны ToggleButton, и когда он Проверил установить видимость холст видимым, и когда он не проверил установить видимость холст, чтобы разрушилась

+0

Пожалуйста, проверьте мои вопросы – Fishman

Смежные вопросы