Заполнение формы visio цветом в C#
Привет, я создаю Shapes из Visio2013, используя C# . Теперь мне нужно заполнить форму несколькими цветами, используя C#, я попробовал приведенные ниже коды, но ничего не имеет смысла:(:(
Visio.Cell cqellname;
cqellname = shape.get_CellsSRC(
(short)Visio.VisSectionIndices.visSectionObject,
(short)Visio.VisRowIndices.visRowFill,
(short)Visio.VisCellIndices.visFillBkgnd);
cqellname.FormulaU = "rgb(255,0,0)";
код выше выдает ошибку, поскольку ячейка охраняется.
shape.get_CellsSRC((short)Visio.VisSectionIndices.visSectionObject,
(short)Visio.VisRowIndices.visRowFill,
(short)Visio.VisCellIndices.visFillBkgnd).FormulaForceU = "RGB(" + R + "," + G + "," + B + ")";
пробовал выше, это не бросает никаких исключений, но ничего не изменилось в форме.
я уже пробовал это решение от stackru и его тоже не работает
Я могу видеть значение, назначенное мной в формах FillForeGnd и FillBkGnd, но форма не заполняется цветом, который я дал.
Может кто-нибудь, пожалуйста, скажите мне, как это сделать..??
2 ответа
Как я уже упоминал в ответе выше (который вы отметили как бесполезный), вы нацелены на неправильную форму.
Теперь, когда вы отредактировали свой вопрос, добавив больше деталей, стало ясно, с какой формой вы имеете дело.
Форма, на которую вы нацеливаетесь, выглядит как "Свернутый подпроцесс" из трафарета "Основные формы BPMN". Это групповая форма, и на верхнем уровне нет геометрии, поэтому изменение ее цвета, как вы делаете в своем вопросе, не имеет визуальных изменений. Чтобы решить эту проблему, вам нужно найти под-форму, которая используется для отображения фона. Бывает, что в этом конкретном мастере подфигура, которая содержит нужную заливку, имеет индекс на один больше родительского, поэтому вы можете использовать это в коде. У фигуры отсутствуют какие-либо другие четкие функции (например, ячейка пользователя), которые могли бы сделать ее лучшим кандидатом, поэтому обратите внимание, что этот метод предназначен именно для этой конкретной фигуры.
Учитывая, что вы, кажется, делаете с этим трафаретом немало работы, мой подход будет состоять в том, чтобы создать копию трафарета и внести некоторые изменения в мастера, чтобы сделать этот вид взаимодействия немного легче, но я надеюсь, что пока что следующий код отвечает на ваш вопрос.
Пожалуйста, отметьте это как ответ, если это так.
public void OnCheckFillBPMN()
{
Color fillColor = Color.FromArgb(1, 255, 0, 0);
CollapsedSubProcessFill(this.Application.ActiveWindow.Selection.PrimaryItem, fillColor);
}
private void CollapsedSubProcessFill(Visio.Shape vShpIn, Color fillColor)
{
if (vShpIn != null && vShpIn.Master != null && vShpIn.Master.NameU.StartsWith("Collapsed Sub-Process"))
{
//The sub-shape that provides the fill colour in
//the 'Collapsed Sub-Process' master is the first index
//after the group shape.
//If you want to use a different method to locate the
//correct sub-shape then do that here.
var targetSubShpId = vShpIn.ID + 1;
var targetShp = TryGetShapeInCollection(vShpIn.Shapes, targetSubShpId);
if (targetShp != null)
{
var targetCell = targetShp.get_CellsSRC(
(short)Visio.VisSectionIndices.visSectionObject,
(short)Visio.VisRowIndices.visRowFill,
(short)Visio.VisCellIndices.visFillForegnd);
targetCell.FormulaU = "RGB(" + fillColor.R
+ ',' + fillColor.G
+ ',' + fillColor.B + ')';
}
}
}
private Visio.Shape TryGetShapeInCollection(Visio.Shapes vShps, int shpId)
{
try
{
if (vShps != null)
{
var targetShp = vShps.ItemFromID[shpId];
return targetShp;
}
}
catch (System.Runtime.InteropServices.COMException ex)
{
if (ex.ErrorCode == -2032465756) //Invalid sheet identifier
{
return null;
}
}
return null;
}
Если FormulaForceU работает, но у вас нет визуальных изменений, то я предполагаю, что вы не устанавливаете правильную ячейку. Обычно вы устанавливаете ячейку FillForegnd (visFillForegnd
), если нет другого набора шаблонов. Также обратите внимание, что (для Visio 2013+), если FillGradientEnabled
установлен в true, это заменит сплошные цвета.
И последнее, что нужно иметь в виду, это то, что фигура, на которую вы нацеливаетесь, может не иметь геометрии или иметь NoFill
ячейка установлена в true, и на самом деле вы должны быть нацелены на ребенка / под-форму.
В любом случае вы должны открыть ShapeSheet и посмотреть, в каком состоянии фигура.