« first day (846 days earlier)      last day (2185 days later) » 

12:09 PM
Для всех практикующих WPF/MVVM, сниппет для создания свойства с INPC:
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>Define a Property With INPC Invocation</Title>
            <Shortcut>propnpc</Shortcut>
            <Description>Code snippet for a property using INPC invocation with Set-method from Vm-class</Description>
            <Author>Andrew ruSO</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
Сохранить в файл: C:\Users\username\Documents\Visual Studio 2017\Code Snippets\Visual C#\My Code Snippets\propnpc.snippet
%USERPROFILE%\Documents\Visual Studio 2017\Code Snippets\Visual C#\My Code Snippets\propnpc.snippet
Пользоваться по propnpc
после привыкания очень ускоряет набор ;)
 
 
5 hours later…
4:56 PM
есть кто тут?
 
5:07 PM
@Bretbas нету никого
 
@Андрей Как так?:)
@Андрей не поможешь?
 
@Андрей у меня есть border, в нем находятся контролы. Как мне настроить прозрачность только background border'а, но чтобы внутренние контролы и обводка этого border'а оставались с полной непрозрачностью?
Я меня свойство Opacity у Border'а, а он, собака, воздействует на все внутренние контролы и на обводку
 
@Bretbas А если не Opacity, а Background менять?
 
у меня цвет представлен в таком виде: 8d8d8d
RGB
альфы нет
 
5:13 PM
ничего не понятно, кусочек разметки покажите
 
конкретно чего?
моей кисти, которую я накладываю на Background моего Border'а?
 
так
т.е. у бордера не прозрачный фон, но надо сделать его полупрозрачным?
 
вот бордер
 
Ну а в чем проблема-то альфаканал добавить?
 
<Border Margin="0 30 0 0"
Background="{Binding ElementName=UC, Path=BackgroundMenu}"
CornerRadius="10"
BorderThickness="3"
BorderBrush="{Binding ElementName=UC, Path=IlluminationColor}"
Padding="0 10 0 10">
тоесть вот так к примеру: 8d8d8d8d?
RGBA
??
 
5:17 PM
Background="#88FAEBD7"
Здесь 88 - это прозрачность
00 - полностью прозразный
FF - полностью непрозрачный
 
Я знаю что 00 это полностью прозрачный
она оказывается вначале идет?
ARGB?
 
да
 
все:) гуд. получилось:) Спасибки
 
а можно в окне Properties просто в процентах задать
он сам в хекс сконвертирует
 
Не:) Это не тру:)
не люблю эти properties. В разметке легче:)
 
5:21 PM
а в вашем случае, если вы выставляете через привязку, то прозрачность надо добавлять конвертером, наверное
 
А можете подсказать, почему у меня вылезает такое исключение: System.InvalidOperationException: 'Не удается анимировать "Foreground.Color" в постоянном экземпляре объекта.'
>
а в вашем случае, если вы выставляете через привязку, то прозрачность надо добавлять конвертером, наверное
да я просто в кисти изменил и все
а потом {StaticResource ...}
 
@Bretbas а как вы его анимируете?
 
Я щас объясню
У меня есть SearchBox - UserControl, который содержит внутри себя TextBox и Button. У этого UserControl'а, я сделал свойство зависимости SearchButtonStyle, которое привязываю к кнопке:
<Button Grid.Column="1"
		Style="{Binding SearchButtonStyle, ElementName=UC}"
		Background="Transparent"
		Foreground="{Binding ElementName=UC, Path=Foreground}"
			FontSize="{Binding ElementName=UC, Path=FontSize}"
			BorderThickness="0"
			Content="&#xf002;"
			FontFamily="{StaticResource FontAwesome}"
			Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}">
	<Button.Template>
		<ControlTemplate TargetType="{x:Type ButtonBase}">

			<Border x:Name="border" Background="{TemplateBinding Background}">
Потом, в App ресурсах, создаю такой стиль:
	<Style TargetType="local:SearchBox" x:Key="DarkSearchBox">
		<Setter Property="PlaceHolder" Value="Search..."/>
		<Setter Property="Background" Value="{StaticResource BackgroundMetalicBrush}"/>
		<Setter Property="Foreground" Value="{StaticResource ForegroundMainBrush}"/>
		<Setter Property="FontFamily" Value="{StaticResource GothamMediumRegular}"/>
		<Setter Property="FontSize" Value="12"/>
		<Setter Property="BorderThickness" Value="3"/>
		<Setter Property="Opacity" Value="0.5"/>
		<Setter Property="BorderBrush" Value="{StaticResource BackgroundCarrotLightBrush}"/>
Ну и объявляю этот UserControl вот так:
		<local:SideMenu IlluminationColor="{StaticResource BackgroundCarrotLightBrush}"
						BackgroundMenu="{StaticResource BackgroundMetalicBrush}"
						Grid.Column="0"
						MenuItems="{Binding MenuVM.Items}"/>
Все. все достаточно прямолинейно
тьфу иы
не тот контрол:0
<local:SearchBox WindowChrome.IsHitTestVisibleInChrome="True" Height="30" Width="250" Style="{StaticResource DarkSearchBox}"/>
Вот
Тоесть у меня анимация происходит в стиле DarkSearchBox, где я определяю стиль для кнопки
Background нормально анимируется, а вот на Foreground выкидывает исключение, когда навожу мышкой на кнопку
 
хм, а кисти покажите свои
ForegroundMainBrush
и BackgroundMetalicBrush
 
5:39 PM
ща
	<Color x:Key="BackgroundMetalic">#85929292</Color>
	<SolidColorBrush x:Key="BackgroundMetalicBrush" Color="{StaticResource BackgroundMetalic}"/>
	<Color x:Key="ForegroundMain">#eeeeee</Color>
	<SolidColorBrush x:Key="ForegroundMainBrush" Color="{StaticResource ForegroundMain}"/>
Самое главное, что если я внутри UserControl'а, у кнопки явно задам Foreground: Foreground="{StaticResource ForegroundMainBrush}", вместо привязывания к Foreground'у моего UserControl'а: Foreground="{Binding ElementName=UC, Path=Foreground}", то ошибка пропадает!
 
хм
 
Но мне не хочется задавать внутреним контролам UserControl'а какие-либо статические цвета. Я хочу чтобы они регулировались внешне - с помощью стилей и задания цветов у UserControl'а
 
а если попробовать одностороннюю привязку?
 
где именно?
 
Foreground="{Binding ElementName=UC, Path=Foreground, Mode=OneWay}"
 
5:45 PM
ща
System.InvalidOperationException: 'Не удается анимировать "Foreground.Color" в постоянном экземпляре объекта.'
нихрена:9
Я еще кстати заметил такую фишку
что если сделать привязку в свойстве To элемент ColorAnimation
Блин не могу найти:)
ща
вот так наппример
<ColorAnimation To="{Binding IlluminationColor, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}" Duration="0:0:0.5" Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.Color"/>
System.InvalidOperationException: 'Не удается зафиксировать данное дерево шкалы времени Storyboard для использования в различных потоках.'
то выдает исключение
 
хз в общем, я не спец в этих ваших анимациях
 
вообщем я уже не знаю как сделать, приходится везде статические кисти задавать, из за таких непонятных ошибок. Хотелось бы конечно вынести это за пределы UserControl'а, чтобы стили и цвета задавались только через него
Да это простая анимация то:)
 
6:21 PM
@Bretbas попробуйте все-таки написать mcve так помочь намного проще
 
@FoggyFinder ок
 
 
2 hours later…
8:46 PM
@Bretbas Привет! Сейчас посмотрю...
@Bretbas Хм, какие полоски ты имеешь в виду? Тёмно-оранжевые? Выставь SnapsToDevicePixels в true.
Это просто полоска попала между пикселей, и сработал антиалиасинг.
@Bretbas Хм. Ну это надо смотреть в исходники. Так ведёт себя, думаю, каждое меню в системе, поэтому я бы не перекраивал это поведение.
Можно попробовать подписаться на раскрытие меню и сделать Mouse.Capture(null), есть шанс, что поможет.
Но я не уверен.
@Bretbas А! Ну да, ты вывел мышку — попап и закрылся :)
Ты хочешь сложное поведение. Я бы его тогда уж программировал руками: подписался на MouseIn и MouseOut, и закрывал бы пункт меню не сразу, а через какое-то время и только если мышь не над дочерним подменю.
Плюс при открытии подменю закрывал бы все неродительские подменю.
Как-то так.
Но это уже по сути переписывание логики контрола. Посмотри, как меню ведёт себя в других программах. Если твоё меню будет вести себя по-другому, юзерам будет неудобно.
Так что я не советовал бы слишком менять поведение.
@Андрей Круто, чё!
А можно, чтобы автоматически апкейсило имя свойства?
Например, backing field color, свойство автоматически Color?
С подчёркиванием наверное было бы проще
 
9:05 PM
@VladD хотел сделать, но пока не понял как, если вообще возможно
@VladD не красиво, подчеркивание и потом с большой буквы...
 
9:34 PM
Интересно, на практике с какой точностью можно "усыпить" поток (или вызвать обработчик таймера например) в c#?
 
9:56 PM
@VladimirGamalyan Ну, поскольку Windows — не real-time OS, то теоретически может проснуться как угодно позже, так что никаких строгих гарантий.
Разве что какая-нибудь QNX или там VxWorks
А как в «нормальных» ситуациях промахивается Thread.Sleep, я не знаю.
В крайнем случае можно задрать приоритет потоку и гонять холостой цикл, опрашивая RDTSC и надеясь, что scheduler не отберёт у потока нужный квант времени
 
@VladD У Thread.Sleep аргумент в миллисекундах, у таймеров, полагаю тоже. Что можно сделать, чтобы усыпить (как минимум) на заданное кол-во микросекунд.
Как минимум - исходя из ограничений OS
У меня станок требует на одном из пинов LPT частоту 12.5kHz, ума не приложу, как их генерить, не опускаясь до уровня драйверов.
 
Ну вот гугл говорит stackoverflow.com/q/6254703/276994
То есть если нужна такая частота, я бы сделал отдельный модуль с простой RTOS
Потому что Windows может в любой момент забрать у потока управление и отдать другому потоку
 
@VladD rtos здесь же не real time operation system подразумеваете?
 
@VladimirGamalyan её самую
я имею в виду отдельный аппаратный модуль
а не программный
 
@VladD меня тычат этим, что под Windows, и все генерирует как нужно.
 
10:09 PM
@VladimirGamalyan Хм. Попробуйте запустить в фоне пару Фотошопов
И посмотреть, сгенерирует ли он как нужно
Или просто fork bomb
 
@VladD в фоне там конечно фотошопа нет, это же станок, но какие-то системные процессы крутятся, да. В том числе windows explorer.
 
Ну Explorer можно и выгрузить, kiosk mode и всё такое
Но мало ли что ОС решит сделать
На вирусы провериться, например
Или сбросить дисковый кеш
 
@VladD К тому, что както там у них получается. Не знаю, может там конечно какой-то супер драйвер на нулевой уровень выходит, и уже ОС под себя запускает, но это вряд ли.
 
Почему бы не сбросить, она ж не RTOS, никому ничего не обещала
@VladimirGamalyan Ну на уровне драйвера потоков нету, это да
Драйверы работают «до» системного scheduler'а
Но снова-таки гарантий Windows не даёт
Так что если они что-то делают, то оно работает не абсолютно, а в большинстве случаев
Из юзермода я что-то сомневаюсь, что можно достичь того, что нужно
Но вы меня не слушайте, я на низком уровне не работал никогда
Может, не всё так ужасно
 
Вот аналогичная прога под linux и табличка по допускам на разном железе
У них даже есть прога, запускаешь на 15 минут, показывает максимальный джит. If the numbers are 100 uS or more (100,000 nanoseconds), then the PC is not a good candidate for software stepping.
Т.е. понятно, что в теории не real-time, и даже не soft real-time, но вот чет лепят, и это работает в промышленных масштабах..
Вощем нужно будет изучать тему.
 
10:18 PM
@VladimirGamalyan Угу. То есть оно как бы кое-где работает
Но не всегда
Тут вопрос в том, что сделает станок, если к нему не поступит вовремя нужный сигнал
То есть насколько жизненно необходима такая точность
 
@VladD В моей задаче можно опоздать. Но при этом затягивать нежелательно. Т.е. например станина сдвинится не за 1 секунду, а за 1.00001, это нестрашно, т.к. последующие шаги все равно раньше не начнутся.
 
Вот я сейчас работаю над медицинским проектом, в котором нужна гарантированная точность 32 kHz
У нас этим занимается отдельная аппаратная фигня
Код на C# генерирует задание, оно отправляется в нужные регистры аппаратной части, и посылается команда «начинай фигачить».
 
@VladD Не, в моем не дали, хотя предлагал сделать USB контроллер.
 
В таком исполнении мы можем дать гарантии. Для медицинской программы это необходимость
 
@VladD зато есть другая приблуда - с одного из датчиков показания снимаются с помощью веб камеры, т.к. другого интерфейса у него кроме индикатора нет.
@VladD Почему 32, а не 32.768 например?
 
10:24 PM
@VladimirGamalyan (Долго искал смайлик «facepalm».)
 
@VladD да, до этого ещё не дошел, но уже openCv примеряю.
 
@VladimirGamalyan Это не к нам, это к производителю контроллера :) У него требование ровно 32000.
 
Для работы с LPT шарп ничего не дал, пришлось внешней dll работать..
@VladD Ладно, спасибо за инфу, завтра попробую подглядеть пристальнее как у других получается все эти килогерцы выдавать..
 
10:40 PM
@VladimirGamalyan Удачи! Поделитесь результатами, хорошо?
 

« first day (846 days earlier)      last day (2185 days later) »