Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269

Заменить свойство Text из WF в WPF

30.08.2019, 11:24. Показов 1851. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В винформе есть такое св-во:
C#
1
public override string Text { get => MessageLabel.Text; set => MessageLabel.Text = value; }
MessageLabel - это обычный Label
Какой аналог есть для WPF?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.08.2019, 11:24
Ответы с готовыми решениями:

TextBox и свойство text
Как записать начальный текст в текстбокс столбиком: текст текст текст В Windows Forms есть стрелочка рядом со свойством Text и...

Привязать свойство в коде с Text у TextBox
using System.Windows; using System.Windows.Controls; namespace HelloWorld.UsersControl { /// <summary> /// Логика...

Свойство FormBorderStyle в WPF
Подскажите как изменить стиль формы в WPF, я знаю что в C# Windows Forms это свойство FormBorderStyle, а здесь как это сделать ??

21
 Аватар для Kazbek17
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
30.08.2019, 11:39
ShmelVG, Все тоже самое есть и WPF. Может я неправильно понял вопрос.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
30.08.2019, 11:57  [ТС]
Kazbek17, Ошибка: не найден метод, пригодный для переопределения.
0
 Аватар для Kazbek17
1483 / 938 / 454
Регистрация: 06.02.2012
Сообщений: 2,868
30.08.2019, 12:13
ShmelVG, WPF Так нельзя.

Добавлено через 49 секунд
Цитата Сообщение от ShmelVG Посмотреть сообщение
Какой аналог есть
Тут только binding использовать
1
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.09.2019, 07:17
ShmelVG, это если СВ, в xaml должно быть x:Name MessageLabel
C#
1
2
    
public string Text { get => MessageLabel.Text; set => MessageLabel.Text = value; }
если mvvm, то в vm сделать обычное свойство с INPC и сделать binding к нему
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.09.2019, 10:46
Цитата Сообщение от Defences Посмотреть сообщение
если mvvm, то в vm сделать обычное свойство с INPC и сделать binding к нему
Нет там не MVVM.
ShmelVG уже неоднократно писал, что для данного проекта он не хочет использовать MVVM. Хочет создать полный аналог WF приложения: без привязок, весь код в CB, задать сотню прослушек различным событиям и т.д.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.09.2019, 10:47
Цитата Сообщение от ShmelVG Посмотреть сообщение
MessageLabel - это обычный Label
Какой аналог есть для WPF?
Примерный аналог WF Label - это WPF TextBlock
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.09.2019, 10:50  [ТС]
Defences, спасибоЭлд Хасп поправил. Так нельзя сделать.
MessageLabel.Content - так нельзя преобразовать object в string
MessageLabel.Text - так соответственно не содержит данное св-во

C#
1
public string Text { get => MessageLabel.Content; set => MessageLabel.Content = value; }
- ругается только на аксессор
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.09.2019, 11:06
ShmelVG, не понимаю с чем у вас возникают сложности? Я же выше написал что нужно просто сделать свойство, не надо ничего переопределять...


XML
1
2
3
4
5
  <Grid>
        <TextBlock x:Name="lbMessage" Text="TextBlock"/>
        <Button Content="Button" Click="Button_Click"/>
 
    </Grid>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(Text);
            Text = "Test";
            MessageBox.Show(Text);
        }
 
 
        public string Text
        {
            get { return lbMessage.Text; }
            set { lbMessage.Text = value; }
        }
    }
Добавлено через 5 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Нет там не MVVM.
ShmelVG уже неоднократно писал, что для данного проекта он не хочет использовать MVVM. Хочет создать полный аналог WF приложения: без привязок, весь код в CB, задать сотню прослушек различным событиям и т.д.
Ну в некоторых случаях так лучше будет. Ибо я сам болел по началу идеей о великом MVVM. Делать по паттерну MVVM и страдать, ради самого паттерна MVVM, а не чтобы решить задачу.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.09.2019, 11:17
Цитата Сообщение от Defences Посмотреть сообщение
Ибо я сам болел по началу идеей о великом MVVM. Делать по паттерну MVVM и страдать, ради самого паттерна MVVM, а не чтобы решить задачу.
Интересно было бы посмотреть на ваши "страдания"... Не представляю решение WPF которое проще сделать без MVVM.

Надо понимать, что MVVM это концепция, а не обязательное разделение на три проекта M-V-VM. Бывают случаи когда CB View выполняет функции Model и VM. Бывает даже когда сама View является одновременно и Model. Это не значит, что нарушена концепция MVVM - это просто такая его реализация.

Даже сейчас, для данной задачи, вы предлагает нужно просто сделать свойство - это уже подразумевает разделение данных и их отображения. Свойство хранит данные, элемент привязанный к этому свойству его отображает. Даже если это свойство - это свойство CB View, даже если привязка отображения сделана не через Binding, а в геттере свойства. Это всё равно реализация MVVM - пусть и не классическая из учебника.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.09.2019, 11:21  [ТС]
Defences, я что-то упустил...Я делал через св-во OnPropertyChanged, но тоже не помогло.

В этом классе св-ву присваивается значение UiForm : Window
Тут я объявляю св-ву согласно примеру выше MessageLineUC : ContentControl
XML
1
2
<TextBlock x:Name="lbMessage"
                   Text="..."/>
А форма MessageLineUC вызывается внутри SelectModeUC
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.09.2019, 11:56
ShmelVG, не понял вас. Кидайте свой код дабы понять вас, раз выше не подходит(хотя я хз что там может не работать то...)

Элд Хасп, ок, простой пример. Открыть форму 2, скрыв форму 1. И наоборот открыть форму 1 из формы 2 и скрыть ее.

В св это будет делаться банально просто, что-то около этого



В главной форме
C#
1
2
3
4
5
6
7
private SecondForm secondForm = new SecondForm();
private void Button_Click(object sender, RoutedEventArgs e)
        {
           secondForm.Owner = this;
           secondForm.Show();
           Hide();
        }
Во второй форме
C#
1
2
3
4
5
private void Button_Click(object sender, RoutedEventArgs e)
        {
           Hide();
           Owner.Show();
        }
А теперь если пытаться это сделать через MVVM, там будет адовое месиво из костылей.

Добавлено через 5 минут
Там какой-то баг с Visible есть, если биндится, то не работает. В итоге в параметрах привязки передавать саму форму и вызывать все манипуляции. А если еще нужно какой-то метод вызвать перед появлением формы, а он в vm, это Action передавать еще нужно в форму, в общем не очень.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.09.2019, 12:39
Цитата Сообщение от Defences Посмотреть сообщение
простой пример. Открыть форму 2, скрыв форму 1. И наоборот открыть форму 1 из формы 2 и скрыть ее.
В св это будет делаться банально просто, что-то около этого
Ну, и делайте это в CB.
Это не сколько не нарушает MVVM. Взаимодействие между объектами внутри уровня никак в MVVM не оговаривается.
Это может нарушать принципы применяемого фрамеворк (Prism и подобных), но это уже больше относится к корпоративным правилам.


Цитата Сообщение от Defences Посмотреть сообщение
ам какой-то баг с Visible есть, если биндится, то не работает. В итоге в параметрах привязки передавать саму форму и вызывать все манипуляции. А если еще нужно какой-то метод вызвать перед появлением формы, а он в vm, это Action передавать еще нужно в форму, в общем не очень.
Если же вам надо привязать видимость окна к данным, то можно это сделать как в CB так и через привязки.
Ни кто не запрещает из CB обращаться к данным и методам VM. У меня бывают реализации где я подписываюсь в CB на VM.PropertyChanged и в прослушке задаю действия нужные для View. Это нисколько не нарушает MVVM.

Что касается "бага", то я с этим разбирался. Есть где-то в разделе тема по этому вопросу. Методы Show() и Hide() разрушают привязку Visiblity окна. Поэтому если используете привязку, то не надо вызывать эти методы. В том числе в App.StartupUri="MainWindow.xaml". В CB App создаёте экземпляры окон, а управлять их видимостью уже должны их VM.
0
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.09.2019, 12:58  [ТС]
Defences,

Здесь, в этой форме в TextBlock должен менять цвет фона и надпись, и меняется название кнопок

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<ContentControl x:Class=".... .Controls.MessageLineUC"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                xmlns:local="clr-namespace:.... .Controls"
                mc:Ignorable="d" 
                d:DesignHeight="250" d:DesignWidth="800" VerticalAlignment="Center">
 
    <Grid Background="#333333" x:Name="MessagePanel" Panel.ZIndex="10" Width="800">
        <Grid.RowDefinitions>
            <RowDefinition Height="150"/>
            <RowDefinition Height="100"/>
        </Grid.RowDefinitions>
 
        <Grid Grid.Row="0">
            <TextBlock x:Name="lbMessage"
                   Text="..."
                   FontSize="18"
                   Padding="390 65"
                   Background="#FFFFC0"/>
        </Grid>
 
        <Grid Grid.Row="1">            
            <Grid.ColumnDefinitions>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
            
            <Grid Grid.Column="2">
 
                <Button x:Name="CancelButton"
                        Background="White"
                        Content="Отмена"
                        Margin="30 15 5 15"
                        FontSize="18"/>
                
            </Grid>
 
            <Grid Grid.Column="3">
 
                <Button x:Name="OkButton"
                        Background="White"
                        Content="OK"
                        Margin="5 15 30 15"
                        FontSize="18"/>
            </Grid>
            
        </Grid>
    </Grid>
</ContentControl>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
using System.Windows;
using System.Windows.Controls;
 
namespace .... .Controls
{
    /// <summary>
    /// Логика взаимодействия для MessageLineUC.xaml
    /// </summary>
    public partial class MessageLineUC : ContentControl
    {
        public string Text
        {
            get { return lbMessage.Text; }
            set { lbMessage.Text = value; }
        }
 
        public MessageLineUC()
        {
            InitializeComponent();
        }
 
        public void UpdateLayout()
        {
            Width = ((Panel)Application.Current.MainWindow.Content).ActualWidth;
 
            Point Location =
                new Point(
                    0,
                    ((Panel)Application.Current.MainWindow.Content).ActualHeight / 2 - Height / 2);
        }
 
        public void ButtonsText(string okButton, string cancelButton)
        {
            if (string.IsNullOrEmpty(okButton))
                OkButton.Visibility = Visibility.Hidden;
            else
            {
                OkButton.Visibility = Visibility.Visible;
                OkButton.Content = okButton;
            }
 
            if (string.IsNullOrEmpty(cancelButton))
                CancelButton.Visibility = Visibility.Hidden;
            else
            {
                CancelButton.Visibility = Visibility.Visible;
                CancelButton.Content = cancelButton;
            }
        }
 
        public void ShowChoice(bool visible)
        {
            Height = visible ? 250 : 150;
            if (!visible)
            {
                OkButton.Visibility = CancelButton.Visibility = Visibility.Hidden;
            }
        }
        
        //public override string Text { get => MessageLabel.Text; set => MessageLabel.Text = value; }
 
    }
}
Вся эта шляпа отображается тут, но мне уже пришлось наговнокодить изменить во благо сохр логики WF, условно, по нажатии кнопки выкл, должна появиться та форма, с соответствующим цветом фона, надписью и наименование кнопки
и в зависимоски какая кнопка вызывает меняется надпись и т.п., это примерный код:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
<ContentControl x:Class="... .Controls.SelectModeUC"
                xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                xmlns:local="clr-namespace:  .... .Controls"
                xmlns:mylocal="clr-namespace: .... .Controls"
                mc:Ignorable="d" 
                d:DesignHeight="480" d:DesignWidth="800"
                Loaded="UserControl_Loaded">
 
    <Grid Background="White">
        
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="2*"/>
                <ColumnDefinition/>
            </Grid.ColumnDefinitions>
 
            <Grid Grid.Column="0">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="1*"/>
                    <ColumnDefinition Width="2*"/>
                </Grid.ColumnDefinitions>
 
                <Grid.RowDefinitions>
                    <RowDefinition Height="0.6*"/>
                    <RowDefinition Height="1*"/>
                    <RowDefinition Height="0.6*"/>
                    <RowDefinition Height="0.5*"/>
                    <RowDefinition/>
                </Grid.RowDefinitions>
 
                ///...тут какой-то код, не влияет на вопрос
 
                <Grid Grid.Row="3">
                    <Button x:Name="offButton"
                        Content="Выключить" Click="offButton_Click"/>
                </Grid>
 
            </Grid>
        </Grid>        
 
        <mylocal:MessageLineUC x:Name="MessLUCForms" Panel.ZIndex="1"/>
 
    </Grid>
</ContentControl>
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public partial class SelectModeUC : ContentControl
    {
        public SelectModeUC()
        {
            InitializeComponent();
            Loaded += UserControl_Loaded;
            MessLUCForms.Visibility = Visibility.Hidden;
        }
 
// ..тут какой-то код
 
        protected override void OnGotFocus(RoutedEventArgs e)
        {
            OnDeviceStateChanged();
        }
 
        private void offButton_Click(object sender, RoutedEventArgs e)
        {
            MessLUCForms.Visibility = Visibility.Visible;
            G.I.Ui_OnPowerOff();
        }
    }
и все формы выводятся тут:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
<Window x:Class="... .UiForm"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace: ..."
        mc:Ignorable="d"
        Title="z" Height="480" Width="800" Loaded="MainForm_Load">
    
    <Grid x:Name="UiFormWindow">
        
    </Grid>
</Window>
Тут урезаный код который я смог сделать чтобы вы примерно поняли
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
using .... .Common;
using ... .Controls;
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
 
namespace ....
{
    /// <summary>
    /// Логика взаимодействия для UiForm.xaml
    /// </summary>
    public partial class UiForm : Window
    {
        SelectModeUC SelectModeCtrl = new SelectModeUC();
        MessageLineUC MessageLineCtrl = new MessageLineUC();
 
        ContentControl ucex = null;
 
        bool _messageLineShow;
        bool _eventLogShow;
 
        public UiForm()
        {
            InitializeComponent();
            Loaded += MainForm_Load;
 
 
            WindowState = WindowState.Normal;
        }
 
        private void MainForm_Load(object sender, EventArgs e)
        {
            MessageLineCtrl.OkButton.Click += (o, ex) => G.I.Ui_OnMessageLineChoice(G.LineboxResult.OK);
            MessageLineCtrl.CancelButton.Click += (o, ex) => G.I.Ui_OnMessageLineChoice(G.LineboxResult.Cancel);
            EventLogCtrl.CloseButton.Click += CloseButton_Click;
 
            if (G.I.Config[Const.SECTION_APP]["Fullscreen"].BoolValue)
            {
                ResizeMode = ResizeMode.NoResize;
 
                var Bounds = new Size(
                       Width = SystemParameters.PrimaryScreenWidth,
                       Height = SystemParameters.PrimaryScreenHeight);
 
                Mouse.OverrideCursor = Cursors.None;
            }
            else
            {
                var ClientSize = new Size(
                       G.I.Config[Const.SECTION_APP]["Width"].IntValue,
                       G.I.Config[Const.SECTION_APP]["Height"].IntValue);
            }
 
            SwitchPage(SelectModeCtrl);
        }
 
 
        private void CloseButton_Click(object sender, EventArgs e)
        {
            HideEventLog();
        }
 
        public void SwitchPage(ContentControl uc)
        {
            if (ucex != null)
            {
                UiFormWindow.Children.Remove(ucex);
                //ucex.OnDeactivate();
            }
 
            if (uc != null)
            {
                HideMessageLine();
                //uc.OnActivate();
                UiFormWindow.Children.Add(uc);
                ucex = uc;
            }
        }
 
        public void EnterState_WaitForStart()
        {
            switch (G.I.CurrentMode)
            {
                case G.WorkMode.Conveyor:
                    SwitchPage(ConveyorModeCtrl);
                    break;
 
                case G.WorkMode.Tunning:
                    SwitchPage(TunningModeCtrl);
                    break;
 
                case G.WorkMode.Marking:
                    SwitchPage(MarkingModeCtrl);
                    break;
            }
 
           
        }
 
        internal void ShowMessageLine(string text, Brush backColor, string okButtonText = null, string cancelButtonText = null)
        {
            Dispatcher.Invoke(new Action(() =>
            {
 
                if (!_messageLineShow)
                {
                    if (ucex != null)
                        ucex.IsEnabled = false;
                    
                    MessageLineCtrl.Visibility = Visibility.Visible;
                    _messageLineShow = true;
                }
// тут я правильно получаю данные для формы
                MessageLineCtrl.ButtonsText(okButtonText, cancelButtonText);
                MessageLineCtrl.ShowChoice(!(string.IsNullOrEmpty(okButtonText) && string.IsNullOrEmpty(cancelButtonText)));
                MessageLineCtrl.Text = text;
                MessageLineCtrl.Background = backColor;
                SwitchPage(MessageLineCtrl);
                MessageLineCtrl.UpdateLayout();
            }
            ));
 
        }
 
        internal void MinimizeWindow()
        {
            WindowState = WindowState.Minimized;
        }
 
        internal void HideMessageLine()
        {
            if (_messageLineShow)
            {
                if (ucex != null)
                    ucex.IsEnabled = true;
 
                UiFormWindow.Children.Remove(MessageLineCtrl);
                MessageLineCtrl.ShowChoice(false);
                _messageLineShow = false;
            }
        }
 
        internal void ShowEventLog()
        {
            if (!_eventLogShow)
            {
                if (ucex != null)
                    ucex.IsEnabled = false;
 
                UiFormWindow.Children.Add(EventLogCtrl);
 
                _eventLogShow = true;
            }
 
            EventLogCtrl.UpdateLayout();
        }
 
        internal void HideEventLog()
        {
            if (_eventLogShow)
            {
                if (ucex != null)
                    ucex.IsEnabled = true;
 
                UiFormWindow.Children.Remove(EventLogCtrl);
                _eventLogShow = false;
            }
        }
}
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
05.09.2019, 13:20
Цитата Сообщение от Defences Посмотреть сообщение
Там какой-то баг с Visible есть
Это не баг, а фича, т.к. там не просто "тупо" булевский флаг
0
215 / 149 / 48
Регистрация: 28.12.2016
Сообщений: 716
05.09.2019, 13:28
Почтальон, да там при любом раскладе так будет, не важно через конвертер или просто привязка к Visible свойству(не bool).

P.s у меня есть предположения, что если все формы скрыты, то нельзя Visible менять. Но это не точно, не помню порядок что сперва скрытие и показ другой или наоборот.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
05.09.2019, 13:30
По умолчанию Visible = Collapsed, а не булевское значение.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16113 / 11234 / 2887
Регистрация: 21.04.2018
Сообщений: 33,035
Записей в блоге: 2
05.09.2019, 14:08
Цитата Сообщение от Defences Посмотреть сообщение
P.s у меня есть предположения, что если все формы скрыты, то нельзя Visible менять. Но это не точно, не помню порядок что сперва скрытие и показ другой или наоборот.
Если сделано так:
ViewModel (INPC подразумеваю, но не прописываю)
C#
1
class ViewModel {public Visibility MainVisibility {get; set}}
View
XML
1
<Window x:Class="nameSpace.MainWindow" Visibility={Binding MainVisibility}
в CB App
C#
1
2
3
ViewModel vm = new ViewModel();
MainWindow mainWin =  new MainWindow() {DataContext = vm};
vm.MainVisibility = Visibility.Visible;
То привязка будет работать нормально.
Просто НЕ НАДО вызывать методы окна Show() и Hide() явно или не явно.
1
 Аватар для ShmelVG
171 / 106 / 51
Регистрация: 27.11.2015
Сообщений: 1,269
05.09.2019, 15:02  [ТС]
Элд Хасп, Почтальон, Defences, круто конечно, но я так и не решил проблему(

Добавлено через 1 минуту
Есть подозрение, что будто они не правильно работают, хотя данные правильны
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
internal void ShowMessageLine(string text, Brush backColor, string okButtonText = null, string cancelButtonText = null)
        {
            Dispatcher.Invoke(new Action(() =>
            {
 
                if (!_messageLineShow)
                {
                    if (ucex != null)
                        ucex.IsEnabled = false;
 
                    MessageLineCtrl.Visibility = Visibility.Visible;
                    _messageLineShow = true;
                }
 
                MessageLineCtrl.ButtonsText(okButtonText, cancelButtonText);
                MessageLineCtrl.ShowChoice(!(string.IsNullOrEmpty(okButtonText) && string.IsNullOrEmpty(cancelButtonText)));
                MessageLineCtrl.Text = text;
                MessageLineCtrl.Background = backColor;
                SwitchPage(MessageLineCtrl);
                MessageLineCtrl.UpdateLayout();
            }
            ));
        }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void SwitchPage(ContentControl uc)
        {
            if (ucex != null)
            {
                UiFormWindow.Children.Remove(ucex);
                //ucex.OnDeactivate();
            }
 
            if (uc != null)
            {
                HideMessageLine();
                //uc.OnActivate();
                UiFormWindow.Children.Add(uc);
                ucex = uc;
            }
        }
Добавлено через 1 минуту
в WF было так и всё работало
C#
1
2
3
4
5
6
7
8
9
if (!_messageLineShow)
                {
                    if (ucex != null)
                        ucex.IsEnabled = false;
 
                    Controls.Add(MessageLineCtrl);
                    //MessageLineCtrl.Visibility = Visibility.Visible;
                    _messageLineShow = true;
                }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void SwitchPage(UserControlEx uc)
        {
            if (ucex != null)
            {
                Controls.Remove(ucex);
                ucex.OnDeactivate();
            }
 
            if (uc != null)
            {
                HideMessageLine();
                uc.OnActivate();
                Controls.Add(uc);
                ucex = uc;
            }
        }
Добавлено через 3 минуты
Пытался сделать так, но ошибка

C#
1
2
for (int i = 0; i < UiFormWindow.Children.Count; i++)
                        UiFormWindow.Children.Add(MessageLineCtrl);
System.ArgumentException: "Указанный элемент Visual уже является дочерним по отношению к другому элементу Visual или корневому элементу CompositionTarget."
0
05.09.2019, 15:44

Не по теме:

Ежики кололись и плакали, но продолжали жрать кактус.....

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.09.2019, 15:44
Помогаю со студенческими работами здесь

Как заставить свойство "Text" компонента Label забиндиться на свойство TheChar из пользовательского класса
Здравствуйте, не получается заставить свойство &quot;Text&quot; компонента Label забиндиться на свойство TheChar из моего класса, основанного на...

Свойство text()
Свойство text() читает только первое слово из двух &lt;select id=&quot;sel&quot;&gt; &lt;option&gt;первое второе&lt;option&gt; &lt;option&gt;первое...

Свойство формы Text
Наверно немного глупый вопрос, но все же. Мне нужно изменить заголовок окна, свойство формы Text, но только программно типо Form.Text =...

Изменить свойство Text кнопки
здравствуйте друзья я начал разбираться в С# буквально два дня назад. так што если я спрашиваю глупасть то извините пожалуйста. ...

Свойство style объекта text
Пусть на html-странице имеется текстовое поле: &lt;input type='text' name='t1'&gt; В скрипте мы хотим работать со свойством style...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru