• Как оптимизировать рисование линий в WPF?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    От нескольких тысяч все что угодно будет тормозить
    Направление указали уже вам, дополню:
    Чтобы не скушать всю оперативу и проц
    читайте про BitmapCache
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    и RenderTargetBitmap
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    в UWP кеширование на более верхнем уровне реализовано, там попроще, но в WPF тоже можно сделать хорошо.
    Алгоритм вкратце:
    2 слоя - верхний -там где тыкаете мышкой
    и нижний - кеш
    Добавили линию (на верхнем слое) - рендерите в картинку (верх+низ) - отрисовываете эту картинку на нижнем слое (например через ImageBrush), линию на верхнем удаляете.
    Т.е. как только пользователь закончил фигуру/действие - кешируете.
    Если нужен интерактив на уже нарисованном (например узлы точек подсвечивать), тут сложнее, но тоже возможно (запоминать коодридинаты узлов и при нахождении там мыши - создавать Xaml объект.)
    С интерактивом в подобных алгоритмах как правило много математики.

    Т.е. у вас в оперативной памяти всегда 1 картинка + сколько-то объектов - полилиний.

    К слову, через кеширование кроме рисования можно делать довольно производительные анимации, производительный зумминг, производительный скролл…

    Есть еще вариант: реализовать рисование на DirectX на C++ и поместить контрол. Более нативно и производительнее.

    P/S
    свойсвто IsHitTestVisible
    https://docs.microsoft.com/ru-ru/dotnet/api/system...
    позволяет не реагировать объекту на мышь (т.е. отключает интерактив) это полезно для объектов фона, сильно бустит производительность.
    (т.к. по умолчанию WPF определяет все события интерактива на всех объектах, а их может быть бесчисленное множество, и далеко не на всех нужно иметь реакцию на нажатие/OnMouseMove)
    Ответ написан
    Комментировать
  • Как добавить в comboBox.Items строку std::string в c++ WinForms?

    SerJook
    @SerJook
    кодер
    combobox->Items->Add(gcnew String(str.c_str()));
    Ответ написан
    Комментировать
  • Как с json взять определенный параметр и записать в массив c#?

    POS_troi
    @POS_troi
    СадоМазо Админ, флудер, троль.
    Создаёте структуру описывающую ваши данные (json) а дальше парсите.
    В гугл посылать не буду, уже влом :)
    https://www.newtonsoft.com/json/help/html/T_Newton...
    Там внизу даже примерчик есть :)
    Ответ написан
    Комментировать
  • Как сделать рандомный цвет нажимая на Button и чтобы Rectangle менял цвет?

    @OwDafuq
    Возьмем в пример такое окно:
    <Grid>
    	<Grid.RowDefinitions>
    		<RowDefinition/>
    		<RowDefinition/>
    	</Grid.RowDefinitions>
    
    	<Button Content="Change color"
    			Click="Button_Click"
    			Margin="15"/>
    
    	<Rectangle Name="MyRectangle" 
    			   Grid.Row="1" 
    			   Margin="15"
    			   Fill="Red"/>
    </Grid>


    Объявим 2 переменные в классе окна:
    private List<SolidColorBrush> brushes;
    private Random rnd;


    Инициализируем в конструкторе:
    public MainWindow()
    {
    	InitializeComponent();
    
    	rnd = new Random();
    	brushes = new List<SolidColorBrush> //заполняем цвета, которые будет принимать Rectangle
    	{
    		Brushes.AliceBlue,
    		Brushes.AntiqueWhite,
    		Brushes.Aqua,
    		Brushes.Aquamarine
    	};
    }


    И в конце код самой кнопки:
    private void Button_Click(object sender, RoutedEventArgs e)
    {
    	MyRectangle.Fill = brushes[rnd.Next(0, brushes.Count)];
    }
    Ответ написан
    2 комментария
  • На каком языке и как лучше написать простую программу?

    Zoominger
    @Zoominger
    System Integrator
    Windows XP/Vista

    Некрофилия.

    чтобы сделать portable версию мне нужно создать инсталятор моей программы

    Нет. Это два взаимоисключающих термина. Просто скомпилируйте свой код в release.

    у конечного клиента может быть не установлено .net и прочее

    Это его проблемы. Не нужно раздувать программу лишними библиотеками.
    Ответ написан
    Комментировать
  • Как добавить строку в уже существующий столбец WPF?

    @fomindp
    .NET программист, фрилансер.
    Привет!
    Вот самый простой пример как можно программно добавить данные в DataGrid:
    <DataGrid Name="dataGridView1" IsReadOnly="True" ColumnWidth="*" VerticalAlignment="Top"
                              CanUserResizeColumns="False" CanUserAddRows="False" CanUserDeleteRows="False"
                              CanUserReorderColumns="False" BorderThickness="0">
                <DataGrid.Columns>
                    <DataGridTextColumn Header="Номер карты" Binding="{Binding Column1}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Симптомы"  Binding="{Binding Column2}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Диагноз"  Binding="{Binding Column3}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Лечение"  Binding="{Binding Column4}"></DataGridTextColumn>
                    <DataGridTextColumn Header="Дата приема"  Binding="{Binding Column5}"></DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>


    using System.Windows;
    
    namespace WpfApp2
    {
    	public partial class MainWindow : Window
    	{
    		public MainWindow()
    		{
    			InitializeComponent();
    		
    			dataGridView1.Items.Add(new TestData { Column1 = "Col1,Row1", Column2 = "Col2,Row1", Column3 = "Col3,Row1", Column4 = "Col4,Row1", Column5 = "Col5,Row1" });
    
    			dataGridView1.Items.Add(new TestData { Column1 = "Col1,Row2", Column2 = "Col2,Row2", Column3 = "Col3,Row2", Column4 = "Col4,Row2", Column5 = "Col5,Row2" });
    
    			dataGridView1.Items.Add(new TestData { Column1 = "Col1,Row3", Column2 = "Col2,Row3", Column3 = "Col3,Row3", Column4 = "Col4,Row3", Column5 = "Col5,Row3" });
    		}
    	}
    
    	public class TestData
    	{
    		public string Column1 { get; set; }
    		public string Column2 { get; set; }
    		public string Column3 { get; set; }
    		public string Column4 { get; set; }
    		public string Column5 { get; set; }
    	}
    }


    Результат:
    5cf4db142c2c8925080095.png
    Ответ написан
    5 комментариев
  • Как изменить model из view с помощью текстбокса?

    petermzg
    @petermzg
    Самый лучший программист
    <TextBox Text="{Binding UserName, UpdateSourceTrigger=PropertyChanged}" />

    Binding.UpdateSourceTrigger, может принимать:

    PropertyChanged
    Источник обновляется немедленно, когда изменяется целевое свойство

    LostFocus
    Источник обновляется немедленно, когда изменяется целевое свойство и цель теряет фокус

    Explicit
    Источник не обновляется, пока не будет вызван метод BindingExpression.UpdateSource()

    Для TextBox по умолчанию значение UpdateSourceTrigger = LostFocus
    Ответ написан
    Комментировать
  • Как выполнить команду по событию KeyDown для TextBox?

    lexxpavlov
    @lexxpavlov
    Программист, преподаватель
    Можно использовать конвертер i:InvokeCommandAction из System.Windows.Interactivity.

    1) Добавить сборку System.Windows.Interactivity с помощью добавления ссылки (она в списке расширений).
    5cf0c5efb3bee685207836.png
    2) Добавить указанную сборку в xaml:
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

    3) Использовать i:EventTrigger и i:InvokeCommandAction:
    <TextBox>
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="KeyDown">
                <i:InvokeCommandAction Command="{Binding KeyDownCommand}"/>
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </TextBox>


    Но если вы хотите там вызывать только обработку представления, например, запретить определённые клавиши (то есть, не нужны данные из слоя бизнес-логики), то есть смысл обработку сделать обычным способом - в code-behind (xaml.cs).
    Ответ написан
    Комментировать
  • JOIN SQL из 4 таблиц?

    Если структура таблиц правильная, тогда, наверное так:

    SELECT sm.Model, sm.Tip, dg.Data_Zakluchenija
    FROM Dogovor AS dg
    JOIN Zakaz AS zk ON dg.id_zakaz = zk.id_zakaz 
    JOIN Prais_List AS pr ON pr.id_prise_list = zk.id_prise_list 
    JOIN Stir_Mashina AS sm ON sm.id_stir_mashina= pr.id_stir_mashina
    Ответ написан
    1 комментарий
  • Как понять что в объект была добавлена информация, но не изменена существующая?

    Zoominger
    @Zoominger
    System Integrator
    Ну так опишите эту логику в set, например, он для того и был придуман.
    Ответ написан
    3 комментария
  • Как вводить в textbox только буквы?

    mindtester
    @mindtester Куратор тега C#
    http://iczin.su/hexagram_48
    а еще лучше использовать специально заготовленные события текстбокса - валидация
    Ответ написан
    Комментировать
  • Как сделать ,чтобы при клике по ненужным координатам отнималось от таймера,например,5 секунд?

    @ase2015 Автор вопроса
    private void pictureBox1_MouseClick(object sender, MouseEventArgs e)
        {
            int currentX = e.X;
            int currentY = e.Y;
            //Переменная для проверки того что мы куда-то попали
            //По умолчанию предполагаем что мы никуда не попали
            bool FindSome = false;
            for (int i = 0; i < objects.Count; i++)
            {
                if (currentX > (objects[i].X - objects[i].Width / 2) & currentX < (objects[i].X + objects[i].Width / 2)
                & currentY > (objects[i].Y - objects[i].Height / 2) & currentY < (objects[i].Y + objects[i].Height / 2))
                {
                    MessageBox.Show("Ты нашел слово: " + objects[i].Name);
    
                    //Отмечаем, что у нас был клик по нужным координатам, куда-то попали
                    FindSome = true;
                }
            }
    
            //Проверяем - был ли клик в нужные координаты
            if (!FindSome) TimeDec(); 
    
        }
    
        //Метод уменьшающий время 
        private void TimeDec()
        {
            MessageBox.Show("Никуда не попали");
            //уменьшаем время
            i-=5;
        }
    Ответ написан
    Комментировать
  • C# System.Windows.Input.KeyEventArgs в System.Windows.Forms.KeyEventArgs?

    @crescent Автор вопроса
    Нашел сам решение:
    private void PossessionField_OnPreviewKeyDown(object sender, KeyEventArgs e)
            {
                Keys formsKey;
                Key wpfKey = e.Key;
                formsKey = (Keys)KeyInterop.VirtualKeyFromKey(wpfKey);
                System.Windows.Forms.KeyEventArgs ev = new System.Windows.Forms.KeyEventArgs(formsKey);
                win.MainForm_KeyDown(sender, ev);
    Ответ написан
    Комментировать
  • Не работает установка LinkedCell для ActiveX TextBox, почему?

    @stictt
    просто рак
    либо указываете ссылку на элемент не правильно, либо адрес, или у вас защита на листе стоит
    Ответ написан
    1 комментарий
  • Можно ли в Windows Form разместить один элемент в собственном потоке?

    petermzg
    @petermzg
    Самый лучший программист
    Вычисления отдельно, анимация отдельно.
    1. Показали контрол с анимацией в UI потоке
    2. Запустили поток с вычислениями.
    3. Вычисления завершились, сообщили в UI поток.
    4. Скрыли/удалили анимацию
    Ответ написан
    Комментировать
  • C#. Что лучше: PictureBox или Paint?

    yudinikita
    @yudinikita
    Инженер-программист из России
    Я считаю, что нужно сначала пытаться отобразить шарики изображением, а если по какой-либо причине картинки не загрузились, то рисовать их.
    1. Создаем переменную с изображением
    Bitmap ImageBall;
    2. При инициализации формы с игрой пытаемся загрузить в эту переменную изображение
    try
    {
        ImageBall = new Bitmap("путь до изображения");
    }
    catch (Exception ex)
    {
        MessageBox.Show(@"Не удалось загрузить: " + ex.Message, @"Ошибка при загрузке изображений!");
    }

    3. Во время генерации шарика, мы проверяем, что изображение загрузилось, иначе рисуем сами
    Bitmap bmp = new Bitmap(50,50);
    Graphics gr = Graphics.FromImage(bmp);  // это пространство на котором рисуется игра
    Rectangle rect = new Rectangle(0,0,50,50); // размер шарика
    if(ImageBall == null) // если картинка не загрузилась
    {
        gr.DrawEllipse(new Pen(Color.Black), rect); // рисуем круг
    }
    else
    {
        gr.DrawImage(ImageBalls, rect); 
    }

    5. Помещаем в PictureBox наш шарик нарисованный или с картинкой
    pictureBox1.Image = bmp
    Ответ написан
    4 комментария
  • Как реализовать LazyLoad у TreeView?

    cyber_roach
    @cyber_roach
    UX дизайнер INEDIapps
    Чем пример с MSDN не устроил ?
    https://docs.microsoft.com/ru-ru/dotnet/framework/...

    Есть момент - при наличии некоторых условий виртуализация отключается:
    - если контейнеры элементов добавляются напрямую к элементу управления ItemsControl.
    - если объект ItemsControl содержит контейнеры элементов различных типов.
    - если для прикрепленного свойства VirtualizingStackPanel.IsVirtualizing установлено значение false
    - если для прикрепленного свойства ScrollViewer.CanContentScroll установлено значение false

    Можно еще взять любой пакет контролов где это реализовано (например Telerik)
    Подсмотреть в их исходниках реализацию виртуализации и сделать свою в преферансом и дамами.
    Ответ написан
    Комментировать
  • Как сделать при нажатии на изображение в picturebox выделение какого-либо элемента?

    profesor08
    @profesor08
    Заранее заготавливаешь координаты периметров фигур. По клику получаешь координату на картинке. Далее проверяешь, попадает ли эта координата в один из периметров. Если попадает, то рисуешь линии на картинке по точкам периметра. Все.

    Чтоб это реализовать тебе надо понимать школьную геометрию, уметь считать и уметь рисовать на картинке.

    Не забудь сохранять оригинал картинки, чтоб обновлять, когда захочется удалить художества.
    Ответ написан
    Комментировать
  • Когда можно искать работу?

    opium
    @opium
    Просто люблю качественно работать
    В любой момент
    Ответ написан
    Комментировать
  • Какому языку, в какой среде начинать учить ребенка программированию 10 лет?

    10 лет это 3 класс

    Отстаньте лучше от ребёнка. Ему всего лишь 10 лет - какое программирование? Пусть он сначала насладится детством. А уже после - сам начнёт ковыряться в том, что ему понравится
    Ответ написан
    7 комментариев