У меня есть форма Windows на C # с 7 текстовыми полями. Каждое текстовое поле обновляет 2 или 3 других, когда его значение изменяется и принимается. Я хочу каким-то образом взять те текстовые поля, которые нужно обновить, и заставить их «мигать» светлым цветом фона или чем-то подобным. Цель состоит в том, чтобы показать пользователю, что обновляется, с добавлением немного чутья.
Я не уверен, есть ли простой способ сделать это, и именно поэтому я спрашиваю здесь. Я могу использовать таймер, цикл while и задний цвет с уменьшающимся альфа-каналом в текстовом поле, я думаю, но я хочу посмотреть, есть ли лучший способ.
jQuery UI имеет " Эффект «Выделить», который показывает, чего я хочу достичь (хотя я хочу, чтобы мой был немного медленнее). Просто перейдите сюда, на страницу демонстрации эффектов пользовательского интерфейса jQuery , выберите «выделить» из раскрывающегося списка в окне и нажмите « У меня есть приложение в смешанном режиме, в котором нативный код выполняет всю тяжелую работу, соблюдая при этом производительность, а за это отвечает управляемый код ...
Как Ханс Пассан желает , вот мой сценарий . У меня есть приложение в смешанном режиме, в котором нативный код выполняет всю тяжелую работу, соблюдая при этом производительность, а управляемый код отвечает только за графический интерфейс. Также пользователи будут участвовать, написав свой собственный код на C #. У меня есть C ++ для собственных классов, C # для графического интерфейса и пользовательского кода и C ++ / Cli для классов-оболочек между ними. Среди всех моих классов C ++ есть один, который выполняет% 90 вычислений и каждый раз создает разные параметры. Назовем его NativeClass. Есть ок. 2000 экземпляров этого NativeClass, и я должен найти правильный экземпляр, связанный с некоторым параметром, прежде чем он выполнит расчет. Поэтому для этой цели я разработал hash_map с параметрами, являющимися хэш-кодом. Когда я получаю параметр, я ищу нужный экземпляр в hash_map, нахожу его и вызываю некоторые из его методов.
Когда пользователи переходят к вычислениям, написав код C #, и этот класс выполняет эти коды с помощью обратных вызовов. Это тривиально, но иногда мне нужна информация о классах .Net, созданных пользователями. Поэтому мне нужно как-то прикрепить этот конкретный ManagedClass к NativeClass. Мое первое решение - использование GChandle.Alloc () и передача адреса дескрипторов. Но есть некоторые опасения по поводу того, что сборщик мусора не будет выполнять свою работу должным образом. Ханс рекомендовал Marshal.AllocCoTaskMem () и Marshal.StructureToPtr () для выделения управляемых объектов в неуправляемой памяти, однако я считаю, что это справедливо для классов или структур типов значений. Как насчет реф-классов? Как я могу передать ссылку на NativeClass, не допуская их сбора GC, и одновременно заставить GC работать правильно?
Вот пример кода:
class NativeClass
{
private:
int AddressOfManagedHandle;
public:
static NativeClass * GetNativeClassFromHashMap(int SomeParameter)
{
// return NativeClass associated with SomeParameter from NativeClassHashMap;
}
NativeClass(int addr, int SomeParameter) : AddressOfManagedHandle(addr)
{
}
int GetAddress(){return AddressOfManagedHandle;}
void DoCalculation(){
// CALCULATIONS
}
};
public ref class ManagedClass : MarshalByRefObject
{
private:
NativeClass* _nc;
//GCHandle handle;
void FreeManagedClass()
{
Marshal::FreeHGlobal(IntPtr(_nc->GetAddress()));
//if(handle.IsAllocated)
//handle.Free();
delete _nc;
}
public:
ManagedClass()
{
IntPtr addr = (Marshal::AllocHGlobal(Marshal::Sizeof(this))); // Error
Marshal::StructureToPtr(this,addr,true);
//handle = GCHandle.Alloc(this);
//IntPtr addr = handle.ToIntPtr();
_nc = new NativeClass(addr.ToInt32());
}
~ManagedClass() {FreeManagedClass();}
!ManagedClass() {FreeManagedClass();}
int GetAddress() {return _nc->GetAddress();};
static ManagedClass^ GetManagedClass(int SomeParameter)
{
int addr = NativeClass::GetNativeClassFromHashMap(SomeParameter)->GetAddress();
//Object^obj = GCHandle::FromIntPtr(IntPtr(addr)).Target;
Object^ obj = Marshal::PtrToStructure(IntPtr(addr), ManagedClass::typeid );
return dynamic_cast(obj);
}
};
Мне очень жаль, что это слишком долго и все еще неясно.