Ответы пользователя по тегу WPF
  • Как осуществляется связь между ViewModel и Model в MVVM?

    @i_light
    Backend, XAML, crossplatform
    Модель в MVVM не должна содержать никаких данных. Данные нужны для отображения во View, соответственно они получаются и используются во ViewModel.

    Model представляет собой модель некой сущности (как правило таблицы БД) и должна состоять в основном из методов манипуляции данными.

    Например:
    UserModel - методы для создания, удаления, редактирования и получения одного или списка пользователей.
    UserViewModel - хранение списка пользователей, либо хранение данных полей пользователя, команды для получения данных из модели, в том числе здесь могут быть и автономно запускающиеся (например по таймеру).
    Ответ написан
    Комментировать
  • MVVM с ним или без него?

    @i_light
    Backend, XAML, crossplatform
    Всегда использовать. Просто - всегда. WPF изначально разработан под связывание и нормальную архитектуру.

    То, что можно делать так же, как в WinForms, не говорит о том, что это стоит делать.

    Просто запомнить как мантру, создал проект - добавь референс на MVVM фреймворк, и работай. Фреймворк любой, например MVVMLight. Или Prism. Или свой велосипед (я так делаю), любой.
    Ответ написан
    Комментировать
  • Как задать Binding для PasswordBox?

    @i_light
    Backend, XAML, crossplatform
    Binding для PasswordBox не реализован вполне намеренно, чтобы не было так просто перехватить пароль, введённый в поле.

    В качестве стандартной и относительно безопасной практики, часто пользуюсь передачей PasswordBox-а в команду логина параметром.

    <TextBox Text="{Binding Login}" x:Name="TbxLogin" />
    <PasswordBox x:Name="PasswordBox" />
    <Button Content="Log in" Command="{Binding SigninCommand}"
    		CommandParameter="{Binding ElementName=PasswordBox}" IsDefault="True" />


    public ICommand SigninCommand { get; set; }
    private void Signin(object param)
    {
    	var passwordBox = param as PasswordBox;
    	if (passwordBox == null)
    		return;
    	var password = passwordBox.Password;
            ...
    }
    Ответ написан
    Комментировать
  • Как работать с окнами в WPF/MVVM?

    @i_light
    Backend, XAML, crossplatform
    Не вижу проблемы, честно говоря. Если вью модель инициализируется во всех окнах одинаково, особенно если автоматически, то можно просто создавать окна и показывать. В зависимости от условий разные.

    Пример:

    Модель:

    namespace MyApp.MyNamespace.ViewModels
    {
    	public class MyWindowModel : INotifyPropertyChanged
    	{
    	   private object _foo;
    	   public object Foo
    	   {
    		  get { return _foo; }
    		  set { _foo = value; RaisePropertyChanged("Foo"); }
    	   }
    
    	...
    
    	}
    }


    Вьюшка:

    <Window x:Class="MyApp.MyNamespace.MyWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:viewModels="clr-namespace:MyApp.MyNamespace.ViewModels">
       <Window.DataContext>
          <viewModels:MyWindowModel x:Key="Model" />
       </Window.DataContext>
       <Grid>
          <TextBlock Text={Binding Foo} />
       </Grid>
    </Window>


    Вызывать можно так, например как вы говорите из окошка логина:
    ...
    // проверяем успешность логина
    if (!loginSuccess)
    	return;
    
    // если всё хорошо, то создаём новое окно
    var myWindow = new MyWindow();
    
    // если нужно - что-то делаем с моделью внутри окна
    var model = myWindow.DataContext as MyWindowModel;
    model.Foo = new object();
    
    // показываем новое окно
    myWindow.Show();
    
    // закрываем текущее окно логина
    var window = Application.Current.Windows[0];
    if (window != null)
    	window.Close();
    Ответ написан
  • Как в wpf комбинировать несколько стилей по типу CSS?

    @i_light
    Backend, XAML, crossplatform
    В WPF это сделать невозможно, причина этому проста - свойство Style объектное и Style - объект. Он может только наследоваться (BasedOn) от другого, и всё.

    Можно попробовать использовать MultiBinding и в его конвертере перебирать все стили и добавлять их сеттеры в коллекцию сеттеров на выходе конвертера. Но надо понимать, что это во-первых довольно толстая операция, причём вызываться будет часто, и во-вторых надо обрабатывать ситуации, когда сеттеры конфликтуют.
    Ответ написан
    Комментировать
  • [C#, WPF] Как сделать подобный выплывающий список?

    @i_light
    Backend, XAML, crossplatform
    Вам нужен wpf accordion
    Ответ написан
    Комментировать
  • Как правильно "подписаться" на событие Completed у вложенных Storyboard?

    @i_light
    Backend, XAML, crossplatform
    Покажите код и можно будет придумать решение.
    Ответ написан
    Комментировать
  • WPF. XAML. Как исправить/усовершенствовать анимацию?

    @i_light
    Backend, XAML, crossplatform
    (банальный костыль)
    Пробовали задать OpacityMask того же цвета, что и фон?
    Чтобы фон как бы был, но 100% прозрачный.
    Ответ написан
  • Как изменить алгоритм масштабирования к иконке в окне (WPF)?

    @i_light
    Backend, XAML, crossplatform
    Вообще, любое масштабирование приводит к потере качества. Никакое сглаживание ситуацию не спасает.

    Что касается иконки в заголовке окна, то она рендерится не силами WPF, насколько мне известно, а самим dwm, поэтому разметкой ничего не решить. Разве что делать кастомный заголовок.

    Лучше всего будет нарисовать иконку размер в размер. Или несколько иконок под разные dpi. По крайней мере, мы в своих проектах поступаем с картинками именно так.
    Ответ написан
    Комментировать
  • Binding Selected TreeNode как это сделать при динамическом биндинге?

    @i_light
    Backend, XAML, crossplatform
    Задайте имя (например, MyControl) элементу с нужным контекстом (в вашем случае нужному HierarchicalDataTemplate) и связывайте через него с полем SelectedItem в модели

    <Grid Name="LayoutRoot">
       <Grid.DataContext>
          <MyModel SelectedItem={Binding DataContext, ElementName=MyControl}>
       </Grid.DataContext>
    ...
    Ответ написан
    5 комментариев
  • Из-за чего пропадают стили в WPF?

    @i_light
    Backend, XAML, crossplatform
    После того, как переопределён ItemTemplate или ItemContainerStyle, старые стили соответственно полностью перезаписываются. Неуказанные значения - перезаписываются значениями по умолчанию.

    Объявление из примера кода равнозначно коду:
    var view = new ListView();
    view.ItemTemplate = new DataTemplate();
    view.ItemContainerStyle = new Style() { ... };


    Если нужно что-то изменить в стиле в ресурсе, надо его редактировать именно в том месте, где он определён. Если же нужно иметь оба стиля, Expression Blend умеет делать копии (правый клик по контролу - Edit Template - Edit a copy). Ну, или просто скопировать и дать другой ключ ресурса.
    Ответ написан
    1 комментарий
  • Как вывести одномерный массив чисел в виде таблицы?

    @i_light
    Backend, XAML, crossplatform
    Ну, например, так:

    int _width = 4;
    
    string formatArray(IEnumerable<int> numbers)
    {
       var output = string.Empty;
       var skip = 0;
       while (skip <= numbers.Count)
       {
          output += string.Join(numbers.Skip(skip).Take(_width), " ") + "\n";
          skip += width;
       }
       return output;
    }
    Ответ написан
    Комментировать
  • WPF. Как правильно связать несколько ListView, расположенных в TabControl, к одному свойству?

    @i_light
    Backend, XAML, crossplatform
    Секция Resources объявляет статические ресурсы контрола. Их нужно использовать так:

    <ListView ItemsSource="{Binding Source={StaticResource ISource}}" />


    x:Name в данном случае не нужно, только x:Key.
    Ответ написан
    Комментировать
  • Как на Wpf сделать чередующуюся прозрачность фона элементов списка?

    @i_light
    Backend, XAML, crossplatform
    Перепишите Setter-ы в нужных местах примерно так:

    <Setter Property="Background">
       <Setter.Value>
          <SolidColorBrush Color="#DAAE1A" Opacity="0.5"/>
       </Setter.Value>
    </Setter>


    Вообще, очень полезно иногда использовать возможности синтаксиса XAML, которые по наследству перешли от XML :)
    Ответ написан
    Комментировать
  • Как сделать анимированное переключение изображений в WPF?

    @i_light
    Backend, XAML, crossplatform
    Используйте триггеры:

    В XAML:
    <Image Source="{Binding CurrentImage}" >
        <Image.Triggers>
            <EventTrigger RoutedEvent="Image.Loaded">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetProperty="(Image.Opacity)" From="0" To="1" Duration="0:0:1" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Image.Triggers>
    </Image>
    
    <Button Content="Next image" MouseLeftButtonDown="NextImageClick"/>


    В классе модели:

    public BitmapImage CurrentImage { get; set; }
    
    public List<BitmapImage> Images { get; set; }
    
    private int _imageIndex = 0;
    
    public void NextImageClick(object sender, MouseButtonEventArgs e)
    {
       if (_imageIndex >= Images.Count) _imageIndex = 0;
       CurrentImage = Images[imageIndex];
       RaisePropertyChanged("CurrentImage");  //необходимо реализовать INotifyPropertyChanged в классе модели
       _imageIndex++;
    }


    Должно сработать :)

    При надобности, анимацию можно сделать любую другую.
    Ответ написан
    Комментировать
  • Как присвоить Source в WPF?

    @i_light
    Backend, XAML, crossplatform
    Нужно подключить namespace в заголовках XAML, примерно так:
    <UserControl x:Class="..."
       ...
       xmlns:res="clr-namespace:<namespace_проекта>.Properties"
       ...


    И затем можно использовать значения из ресурсов, примерно так:

    <Image Source="{x:Static res:Resources.<имя_ресурса>}" />


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

    Собственно, можно погуглить "wpf using resx in xaml".
    Ответ написан
    Комментировать