none
как сделать прозрачную панель? RRS feed

  • Вопрос

  • Возможно ли сделать так, чтобы у ListBox'а элементы были видимы и активны, а панель на которой они расположены была прозрачна. (не путать с

    Background="Transparent"
    

    )
    нужно, чтобы можно было добраться до элементов, расположенных позади ListBox'а. (между элементами ListBox'а есть просветы).
    Ситуация: Коллекции (ListBox'ы или ListView) визуально должны быть расположены в одном пространстве. Элементы коллекций содержат кнопки.
    (разрабатываю на WPF)
    заранее Спасибо!





    • Перемещено Abolmasov Dmitry 11 января 2012 г. 10:39 (От:Игры)
    • Изменено Абай 14 мая 2012 г. 3:06 ошибку исправил
    6 января 2012 г. 4:19

Ответы

  • Нужно поменять стиль ListBox удалив визуализацию самого элемента, но оставив визуализацию коллекции.
    Влюблен в WPF Не пишу на C#
    • Помечено в качестве ответа Абай 28 июня 2012 г. 5:46
    13 января 2012 г. 7:58
    Отвечающий

Все ответы

  • Нужно поменять стиль ListBox удалив визуализацию самого элемента, но оставив визуализацию коллекции.
    Влюблен в WPF Не пишу на C#
    • Помечено в качестве ответа Абай 28 июня 2012 г. 5:46
    13 января 2012 г. 7:58
    Отвечающий
  • Можно привести пример? Какие свойства ListBox требуется определить? (пробовал различные реализации ItemTemplate и Template)


    • Изменено Абай 13 января 2012 г. 10:59
    13 января 2012 г. 10:57
  • Уважаемый пользователь!

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


    Для связи [mail]
    19 января 2012 г. 12:22
  • Вопрос актуален. Есть ли такая возможность? вырезать с помощью свойства Clip я думаю было бы неправильно.
  • Задача оказалась не такой простой, но она решаемая это факт. Для подтверждения взял вот эти строчки

     <Grid>
            <Button Click="Button_Click">ddddd</Button>
                <ListBox>
                    <ListBox.Template>
                        <ControlTemplate></ControlTemplate>
                    </ListBox.Template>
                    <ListBoxItem>ffff</ListBoxItem>
                </ListBox>
        </Grid>

    Как видно из примера мы полностью стираем стандартный шаблон элемента задавая пустой ControlTemplate и событие щелчка проходит на кнопку под элементом. Осталось его теперь переделать так что бы элемент выполнял свои функции и решал поставленную задачу. Проблема в том, что в стандартный ListBox входит еще и ScrollViewer, а значит что его шаблон тоже придется переопределять.

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



    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • К сожалению как показал вот этот тестовый код:

     <Grid>
            <Button Click="Button_Click">ddddd</Button>
                <ScrollViewer>
                    <ScrollViewer.Template>
                        <ControlTemplate></ControlTemplate>
                    </ScrollViewer.Template>
                 </ScrollViewer>
        </Grid>
    Событие под элемент не передается, хотя его фактически и нет. Не знаю с чем это связано и откровенно говоря не знаю как решить. Подождем может кто другой подскажет.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    Отвечающий
  • попробуйте в свойствах окна сделать AllowsTransparency="True" Opacity="0.9" WindowStyle="None", а в вашем элементе Opaciti="1"

  • Не работает. Если получится у кого-нибудь решить такую задачу, прошу поделиться примером.
    6 июня 2012 г. 10:52
  • Хотя я и не уверен, что правильно понял вашу ситуацию, но все же предложу свой вариант.

    Если кратко, то ListBox вкладывается в Popup, для которого есть возможность указать  AllowsTransparency="True". Попутно пишем свой ControlTemplate для ListBox и ListBoxItem. После этого получаем что-то вроде этого

    но радуемся не долго. Пробуем изменить размер окна и... размер окна меняется, а наш Popup с ListBox'ом остается на прежнем месте. Для решения этой проблемы ничего лучше, кроме как обрабатывать событие окна SizeChanged и заново устанавливать IsOpen="True" я не придумал.  

    <Window ... SizeChanged="Window_SizeChanged">

    <Window.Resources>

    <Style x:Key="ListBoxStyle" TargetType="ListBox">...</Style>

    </Window.Resources> <Grid Width="250" Height="400"> <StackPanel> <Button /> <Button /> <Button /> ... </StackPanel> <Popup x:Name="popup" Width="{Binding Width,ElementName=grid}" Height="{Binding Height,ElementName=grid}" AllowsTransparency="True" IsOpen="True" Placement="Relative" PlacementTarget="{Binding ElementName=grid}"> <ListBox x:Name="listBox" Style="{StaticResource ListBoxStyle}" /> </Popup> </Grid> </Window>

    P.S. Этот вариант реализации ужасен и накладывает серьезные ограничения на компоновку, не используйте его в реальном приложении.

    UPD. Обнаружены проблемы: при размере окна меньшем, чем размер ListBox'а Popup вылезает за пределы окна, а также если переместить окно, то Popup выходит за границы окна (т.е. остается на прежнем месте, возможна корректировка положения Popup в обработчике события Window.LocationChaged). 




    12 июня 2012 г. 14:30
  • Решение с Popup скорее не решение, а создание дополнительных проблем.

    Единственный вариант, который я вижу - это создания своего контрола ListBox с нуля в частности так что бы его контейнер прокрутки не воровал фокус.


    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    14 июня 2012 г. 17:52
    Отвечающий
  • А установить Background в {x:null} не пробовали? Обычно именно null-background начинает пропускать события "под себя".
    19 июня 2012 г. 5:40
  • А установить Background в {x:null} не пробовали? Обычно именно null-background начинает пропускать события "под себя".
    Как я писал выше причина проблемы ScrollViewer элемента ListBox, который не пропускает под себя события. А вот если задать элементу ListBox пустой Template, то события сразу проходят. Собственно выше я дал ответ, который как я понимаю является единственным решением - писать свой ScrollViewer, который встраивать в шаблон ListBox и который будет пропускать события.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    19 июня 2012 г. 5:49
    Отвечающий
  • Абай проблема еще актуальна? Пожалуйста не оставляйте топик без ответа.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    28 июня 2012 г. 5:29
    Отвечающий
  • да. на текущий момент проблема еще актуальна. Контрол пропускающий под себя события еще не писал.
    28 июня 2012 г. 5:36
  • да. на текущий момент проблема еще актуальна. Контрол пропускающий под себя события еще не писал.
    Ну похоже другого решения никто предложить не может. Судя по всему ответ на ваш изначальный вопрос дан. Пометьте пожалуйста соответствующий ответ.

    Женат на WPF. Тайно встречаюсь с WinRT. Не сложилось с C#!

    28 июня 2012 г. 5:44
    Отвечающий